是&&和总是得到评估

时间:2010-03-29 02:38:55

标签: php conditional if-statement

我有这个if语句,用于测试以下2个条件。第二个是函数goodToGo()所以我想调用它,除非第一个条件已经为真

$value = 2239;

if ($value < 2000 && goodToGo($value)){
   //do stuff
}

function goodToGo($value){
   $ret = //some processing of the value
   return $ret; 
}

我的问题是关于2 {if}条件$value < 2000 && goodToGo($value)。他们都得到评估,还是第二个只在第一个是真的时才得到评估?

换句话说,以下2个区块是否相同?

if($value < 2000 && goodToGo($value)) {
   //stuff to do
}

if($value < 2000) {
    if (goodToGo($value)){
       //stuff to do
    }
}

6 个答案:

答案 0 :(得分:76)

否 - 不会始终执行第二个条件(这会使您的示例等效)。

PHP的&&||andor运算符被实现为“短路”运算符。一旦发现条件强制整个条件的结果,后续条件的评估就会停止。

来自http://www.php.net/manual/en/language.operators.logical.php

// --------------------
// foo() will never get called as those operators are short-circuit

$a = (false && foo());
$b = (true  || foo());
$c = (false and foo());
$d = (true  or  foo());

答案 1 :(得分:6)

是。两个街区是一样的。与大多数(但不是全部)语言一样,PHP对&&||使用短路评估

答案 2 :(得分:3)

两个街区相同。

PHP逻辑运算符是“懒惰的”,只有在需要时才会对它们进行求值。 以下代码打印“Hello,world!”:

<?php
$a = 10;
isset($a) || die ("variable \$a does not exist.");
print "Hello, world!"
?>

其他逻辑运算符包括&amp;&amp;,和,或。

<?php
perform_action() or die ('failed to perform the action');
?>

是一种流行的习语。

答案 3 :(得分:2)

仅当第一个条件为真时才会检查第二个条件,因此两个语句都是等价的。

答案 4 :(得分:1)

是的,您提供的2个代码块是等效的。 PHP有短路,所以当你使用时 ||和&amp;&amp;,在第一个之后的任何陈述只在必要时进行评估。

答案 5 :(得分:0)

总是用你自己的语言来处理你的技术语言,同样在这里,如果我在口头交谈中说你,就像:你问=“我是否饿了”&amp;&amp;'我正在吃披萨“类似于”如果我饿了那么我只吃披萨“? 所以在这里你可以看到后来的短语说,直到我不饿,我不吃披萨,而前者说我很吵,我正在吃披萨。 : - )