6

我有点优化怪胎(至少按照我的定义),这个问题困扰了我很长一段时间。

我想知道 PHP 是否对 && 和 || 做了一些优化:举个例子:

$a = "apple";
$b = "orange";
if ($a == "orange" && $b == "orange") {
    //do stuff
}

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

我对 || 有同样的问题:

$a = "orange";
$b = "orange";
if ($a == "orange" || $b == "orange") {
    //do stuff
}

当它检查 $a 是否等于“橙色”时,它返回 true。因为那会使|| 运算符返回 true,PHP 是否会检查 || 的第二部分 (因为我们已经知道这将是真的)?

希望我在这里有意义,希望有人能回答我。谢谢!

4

2 回答 2

6

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

例如...

method_exists($obj, 'func') AND $obj->func();

...是对这一事实的利用。在此示例中,仅当 LHS 返回值时才会评估 RHS 。此处的逻辑是有道理的,因为您只想在方法存在时调用它(只要您不使用__call(),但那是另一回事)。

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

defined('BASE_PATH') OR die('Restricted access to this file.');

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

于 2012-04-08T02:55:29.703 回答
1

是的,PHP 短路了&&and||运算符,这意味着不,如果左操作数的值意味着不需要计算,则不会计算右操作数。无需优化它们。你可以像这样测试它:

function one() {
    echo "One";
    return false;
}

function two() {
    echo "Two";
    return true;
}

one() && two(); // Outputs One
echo "\n";
two() || one(); // Outputs Two

这是一个演示。如果没有短路,你会得到:

OneTwo
TwoOne
于 2012-04-08T02:58:21.697 回答