2011-12-05 154 views
37

有人可以解釋我爲什麼這樣的:類型轉換爲布爾

var_dump((bool) 1==2); 

回報

bool(true) 

var_dump(1==2); 

回報

bool(false) 

當然,第二次返回是正確的,但爲什麼在第一次php返回一個意外的值?

+9

操作順序讓你在這裏... – Brad

回答

74

它實際上並不像看起來那麼奇怪。 (bool) has higher precedence than ==,所以這樣的:

var_dump((bool) 1==2); 

是相同的:

var_dump( ((bool) 1) == 2); 

或本:

var_dump(true == 2); 

由於type juggling,該2也基本上被轉換爲bool(因爲這是一個「鬆散的比較」),所以它等同於:

var_dump(true == true); 

或本:

var_dump(true); 
+0

謝謝!非常詳細的解釋:) –

+0

不客氣! – ruakh

+2

...嘗試始終使用'===' – xDaizu

19

因爲在第一個例子中,演員發生在比較之前。所以,就好像你寫

((bool) 1)==2 

這相當於

true == 2 

這是通過轉換2true和比較,最終產生true評估。

要見你需要添加括號預期的結果,使順序明確:

var_dump((bool)(1==2)); 

See it in action

+1

+1感謝您的快速響應 –

6

我用這樣的方式:

!!0 (false) 
!!1 (true) 
+4

正如標題要求輸入的那樣,這個答案是正確的,幾乎可以用於任何語言。這種結構對於像JavaScript這樣的語言來說是非常好的,你需要真正的「真」或「假」,但不能保持原始值。順便說一句,用(bool)進行類型轉換要快一點。 –

0

你寫的聲明((布爾)1 == 2)的方式將永遠,因爲它會返回true總是執行下面的流程代碼:

首先,它會執行

(bool)1 

和(bool)1將返回true。

現在,因爲(布爾)1是在第二個步驟真正的語句會像

true ==2 

因爲如果我們將強制轉換2到布爾它將返回true,在最後的狀態你的發言就會像

true == true 

這顯然會返回true。 同樣的事情,我已經在我的帖子PHP Type casting中解釋過。

相關問題