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 ||和 && 逻辑优化的主要内容,如果未能解决你的问题,请参考以下文章