php ||和 && 逻辑优化

Posted

技术标签:

【中文标题】php ||和 && 逻辑优化【英文标题】:PHP || and && logical optimization 【发布时间】: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'; 【参考方案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

【讨论】:

如果重要的事情应该发生在函数二()中,那可能永远不会发生,所以要小心限制你写的行数;)

以上是关于php ||和 && 逻辑优化的主要内容,如果未能解决你的问题,请参考以下文章

php 优化联系表格7 CSS&JS

我 && yii2 (路由优化)

Apache应用和优化篇:编译安装以及重新认识PHP

微信小程序接口安全优化(AES加密)

阿昌之丑陋代码优化通过策略模式&模版模式来优化Controller执行流程

优化 x86 的逻辑与运算