【问题标题】:PHP || and && logical optimizationphp ||和 && 逻辑优化
【发布时间】:2012-04-21 01:08:20
【问题描述】:

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

我想知道 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 是否会检查 || 的第二部分(因为我们已经知道它会是真的)?

希望我在这里说得通,希望有人能回答我。谢谢!

【问题讨论】:

  • 我一直这么认为。而且,在实践中,AND 运算符确实以这种方式工作。例如,我可以做if (isset($a) && $a instanceof SomeClass && $a->someMethod() == 'orange'),它必须通过条件的每一步才能测试下一个。但是,除了我知道它有效这一事实之外,我没有什么可以支持我的。
  • 为什么不试试呢? if (true || die()) { echo '1';}if (true && die()) { echo '1';}

标签: php performance optimization logic


【解决方案1】:

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()s 脚本。

【讨论】:

  • 您能不能用外行的话来改写它?哈哈。我会在这些词上做一个快速的谷歌搜索。
  • @DrAgonmoray 在第一个条件之后,PHP 只会在必要时评估附加条件:)
  • @DrAgonmoray 我添加了一个例子,希望它比阅读我的解释更清楚:)
【解决方案2】:

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

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

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

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

Here's a demo. 如果没有短路,你会得到:

OneTwo
TwoOne

【讨论】:

  • 如果重要的事情应该发生在函数二()中,那可能永远不会发生,所以要小心限制你写的行数;)
猜你喜欢
  • 1970-01-01
  • 2012-08-10
  • 2016-09-11
  • 1970-01-01
  • 2015-03-26
  • 1970-01-01
  • 2023-03-27
  • 2019-05-07
  • 1970-01-01
相关资源
最近更新 更多