PHP || 和&&逻辑优化

fru*_*cup 6 php optimization performance logic

我是一个优化狂热者(至少按照我的定义),这个问题已经困扰了我很长一段时间.

我想知道PHP是否对&&和||进行了一些优化:采用以下示例:

$a = "apple";
$b = "orange";
if ($a == "orange" && $b == "orange") {
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

当该代码执行时,它将检查$ a是否等于"orange".在这种情况下,它不是.但是,有一个&&运算符.由于第一部分($ a =="orange")已经返回false,PHP仍会检查$ b是否等于"orange?"

我对||有同样的问题:

$a = "orange";
$b = "orange";
if ($a == "orange" || $b == "orange") {
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

当它检查$ a是否等于"orange"时,它返回true.因为那会使|| 运算符返回true,PHP甚至会检查||的第二部分 (因为我们已经知道它会是真的)?

希望我在这里有意义,希望有人能给我一个答案.谢谢!

ale*_*lex 6

PHP使用二进制条件(例如,或它们的常量等价物)进行短路评估,因此如果评估LHS的结果意味着RHS不是必需的,则不会.&&||

例如...

method_exists($obj, 'func') AND $obj->func();
Run Code Online (Sandbox Code Playgroud)

......是对这一事实的利用.只有在此示例中LHS返回值时才会评估RHS .这里的逻辑是有道理的,因为你只想调用一个方法(只要你没有使用__call(),但这是另一个故事).

您也可以OR以类似的方式使用.

defined('BASE_PATH') OR die('Restricted access to this file.');
Run Code Online (Sandbox Code Playgroud)

此模式通常用作PHP文件中的第一行,这些文件旨在包含在内,而不是直接访问.如果BASE_PATH常量不存在,则LHS是假的,因此它执行RHS,即die()脚本.