我有点像优化狂(至少按照我的定义),这个问题困扰了我很长一段时间。
我想知道 PHP 是否对 && 和 || 做了一些优化: 举个例子:
$a = "apple";
$b = "orange";
if ($a == "orange" && $b == "orange") {
//do stuff
}
当该代码执行时,它将检查 $a 是否等于“orange”。在这种情况下不是。但是,有一个 && 运算符。由于第一部分 ($a == "orange") 已经返回 false,PHP 是否还会检查 $b 是否等于 "orange"?
我对||有同样的问题:
$a = "orange";
$b = "orange";
if ($a == "orange" || $b == "orange") {
//do stuff
}
当它检查 $a 是否等于“orange”时,它返回 true。因为那样会使 ||运算符返回 true,PHP 会检查 || 的第二部分吗? (因为我们已经知道这是真的)?
希望我在这里说得有道理,也希望有人能为我解答。谢谢!
最佳答案
PHP 使用 short circuit evaluation使用二进制条件(例如 &&
、||
或它们的等价常量),因此如果评估 LHS 的结果意味着 RHS 不是必需的,则它不会.
例如……
method_exists($obj, 'func') AND $obj->func();
...是对这一事实的利用。在此示例中,仅当 LHS 返回 truthy 值时,才会评估 RHS。这里的逻辑很有意义,因为您只想调用一个存在的方法(只要您不使用 __call()
,但那是另一回事了)。
您也可以以类似的方式使用OR
。
defined('BASE_PATH') OR die('Restricted access to this file.');
此模式经常用作 PHP 文件中的第一行,这些文件旨在包含而不是直接访问。如果 BASE_PATH
常量不存在,则 LHS 为 falsy 因此它执行 RHS,die()
脚本。
关于PHP || and && 逻辑优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10060018/