2012-04-08 87 views
6

我是一个优化怪胎(至少根据我的定义),这个问题一直困扰着我很长一段时间。PHP ||和&&逻辑优化

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

希望我在这里有意义,希望有人对我有一个答案。谢谢!

+0

这就是我一直认为。而且,在实践中,AND运算符确实以这种方式工作。例如,我可以做'if(isset($ a)&& $ a instanceof SomeClass && $ a-> someMethod()=='orange')',它必须通过条件的每一步来测试下一个。但是,除了我知道它的作用之外,我没有任何支持我的东西。 – 2012-04-08 02:57:00

+2

为什么不尝试呢?'if(true || die()){echo'1';}'和'if(true && die()){echo'1';}' – 2012-04-08 03:00:44

回答

6

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

+0

你可能用通俗的话来说呢?哈哈。我会对这些词做一个快速的谷歌搜索。 – fruitcup 2012-04-08 02:56:27

+0

@DrAgonmoray在第一个条件之后,PHP将只在必要时评估附加条件:) – rawb 2012-04-08 02:57:24

+0

@rawb谢谢。 :) – fruitcup 2012-04-08 02:57:48

1

是的,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