2010-03-29 85 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