2011-05-13 87 views
2

以下代碼不會給出任何錯誤。但是我對第二部分的研究很有幫助。php和問題

.......... 
// Get meta data for the module 
$this->template->module_details = $this->module_details =  
$this->module_m->get($this->module); 

// If the module is disabled, then show a 404. 
empty($this->module_details['enabled']) AND show_404(); 
.......... 

對於我來說,第二部分應該是這樣的。

if(empty($this->module_details['enabled']){ 
show_404(); 
} 

Q1。它是一樣的嗎? AND發生了什麼? Q2302。你可以把第一部分放兩倍嗎?你爲什麼需要這樣做? (A = B = C)

在此先感謝。

回答

3

Q1:每個布爾運算符都表現爲「懶惰」。這意味着,如果表達式definitly解析爲true,或false,它不會評估以下的(子)表達

true or doSomething(); 
false and doeSomething(); 

在兩種情況下,不執行doSomething(),因爲布爾表達式是已經知道是true/false。另一種方式圓

true and doSomething(); 
false or doSomething(); 

這裏doSomething()始終執行,因爲它的執行,直到(完全)表達式的結果是未知的。

所以,你是對的,那show_404()被執行,如果與empty()部分計算爲true,在if什麼樣的結果語句來你給。 Q2:在PHP中,每個運算符都有一個返回值。在=(賦值)的情況下,返回值就是分配的值。

$a = $b = 1; 
// => 
$a = ($b = 1); // where ($b = 1) === 1 

沒有人真正需要,但有時它是有用的,因爲它比較明顯,那$a$b具有相同的在這一點上的價值。

2

問題一

and用作logical short circuit

爲了執行表達式的第二部分,第一部分需要爲真。這實質上構成了LHS對於執行RHS的條件 - 這是一個有用的,如果有時難以理解的句法快捷方式。

如果LHS是錯誤的,那麼解釋者知道它不需要麻煩檢查RHS,因爲從(false && (true || false) === false)起,整個語句將評估爲false

問題二

的分配總是返回RHS的值。

你可以很輕鬆地把它分解到:

$this->module_details = $this->module_m->get($this->module); 
$this->template->module_details = $this->module_details; 

..或將支架使得它多一點顯而易見:

$this->template->module_details = 
    ($this->module_details = $this->module_m->get($this->module)); 

舉個例子,評估賦值的右手邊是常用於while循環中,例如:

while ($row = mysql_fetch_assoc($query)) {} 

這是可行的,因爲mysql_fetch_assoc re在沒有結果時變爲false,因此($row = false)的計算結果爲false並停止while循環。

2

它不應該混淆你太多,你可能已經看到了替代品,但只是沒有連接它。

記住

mysql_query($sql) OR die(" :("); //false or die('died'); 

這意味着,執行查詢或死!

empty($this->module_details['enabled']) AND show_404(); 

這裏恰恰相反。

If it's empty, show 404; //true and die('died'); 

您可以使用||代替OR就像在其他情況下,它只是運算符優先級是不同的。

至於你的第一個問題。

這只是意味着我們爲a,bc設置了相同的值;

$a = $b = $c = 0; //setting all to 0; 
+0

'='是assigment而不是比較'=​​='/'===' – KingCrunch 2011-05-13 10:22:22

+0

@KingCrunch我知道這一點。如示例中清楚顯示的,我將相同的值分配給所有變量。我已經重新陳述了這個陳述,以免其他人錯誤地假設 – JohnP 2011-05-13 10:24:33