哪种方式更有效?

Geo*_*iuc -1 php performance

我会尽量保持这个简单.我做了twp函数来测试一些东西:

//user valid
function validusr(){
    return true;//or false, depends
}
//user in db
function indbusr(){
    return true;//or false, depends
}
Run Code Online (Sandbox Code Playgroud)

后来,我有这个

    if ( !validusr( $myval ) ) return validusr( $myval );       
    else if ( !indbusr( $myval ) ) return indbusr( $myval );            
        else return true;
Run Code Online (Sandbox Code Playgroud)

然而,这似乎并不好,因为我正在调用该函数2次:一次测试$myval,一次我返回它.但是,如果我说,存储这样的值:

$result1=validusr($myval);
$result2=indbusr($myval);

        if  (!$result1)  return $result1;       
        else if ( !$result2) return $result2;           
            else return true;
Run Code Online (Sandbox Code Playgroud)

可能存在第二个语句永远不会运行的情况,因为第一个语句总是为真,这使得调用第二个函数无效.

那么哪一个更有效率?存储价值并冒险使用它,或者只在需要时调用该功能两次?

小智 6

你的逻辑归结为:

If the user is valid AND in the database, return true, otherwise, return false;
Run Code Online (Sandbox Code Playgroud)

您可以利用PHP的内部优化器来确定要调用的函数.使用这个:

return (validusr($myval) && indbusr($myval));
Run Code Online (Sandbox Code Playgroud)

PHP将执行第一个函数并展望表达式.如果函数返回true,它将继续执行下一个函数.如果它返回false表达式将是false下一个函数返回的任何内容,因此PHP不会打扰它并false立即返回.

类似地,PHP会在遇到序列中的值时$a || $b ||someFunction($c)通过返回来优化OR表达式().(感谢dognose突出显示!)truetrue

如果您的功能没有副作用,那就太棒了.如果你依靠你的第二个功能除了回答真/假问题之外还有一些其他的影响,这对你不起作用.

你可以看到它在这里工作- 尝试更改函数的返回值,看看运行它时会发生什么.