2010-03-29 98 views
28

我有这if声明,测试下面的两个条件。第二个是一个功能goodToGo()所以我想打电话给它,除非第一个条件已经成为事实&&总是得到评估后的条件

$value = 2239; 

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

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

我的问题是关于2,如果条件$value < 2000&&goodToGo($value)。他们都被评估过吗?或者第二个评估是否只在第一个评估结果为真时才被评估?

换句话说,以下两块相同吗?

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

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

难以检查吗? – 2010-03-29 02:41:36

+0

@Col,感谢您的帮助。怎么样? – brett 2010-03-29 02:43:51

+0

是否具有打印功能? if(test1()&& test2())... – 2010-03-29 02:44:30

回答

60

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

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()); 
+0

我之所以选择这个答案是因为它提出了一个关于'(true || foo())'。本来想第二个会评估,因为第一个是“真”,但看起来不是这样。很高兴知道。 – brett 2010-03-29 03:10:09

+1

@brett,是的 - 关键是对于OR,你知道它会在你第一次发现TRUE时为TRUE - 没有任何FALSE会改变它。对于AND,你知道在第一次找到FALSE时它将会是FALSE - 没有任何TRUE会改变它。 – sblom 2010-03-29 04:26:31

+0

解释是有道理的。 – JayKandari 2017-05-15 11:44:22

5

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

1

是的,你给出的2个代码块是等价的。 PHP有短路,所以当你使用 ||和& &,第一个之后的任何语句只在必要时才被评估。

2

当且仅当第一个是真实的,因此这两个语句是等效的第二条件将只进行检查。

3

这两个块是相同的。

PHP逻辑操作符是“懒惰”的,它们只在需要时才被评估。 下面的代码打印 “你好,世界!”:

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

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

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

是一个流行的成语。

0

始终corelate您的技术语言有自己的语言,同样在这里,如果我说你在口头交谈,它只是想:你问=“如果我饿了‘& &’我吃比萨”类似于“如果我饿了,那么只有我在吃披萨”? 所以在这里你可以看到,后来的短语说,直到我不饿,我不吃披萨,前者说我是hum and,而我正在吃比萨饼。 :-)

+1

现在我感觉饿了:)但我不吃披萨 – 2010-03-29 06:44:29