$num = 0;if($num == 'hello'){ echo $num; // echo 0}
回複內容:
$num = 0;if($num == 'hello'){ echo $num; // echo 0}
看看官網: PHP 類型比較表
具體原因,也有說明
更新 2015-12-10 09:54:28
看了你的評論,我覺得有必要再更新一下。
你犯了一個錯誤,我把它稱為想當然的知識遷移。看看我之前寫的《代碼之謎》系列。
字串=true
0 = false
你的思路是這樣的:
因為: 字串=true (前提)因為:0 = false (前提)又因為: true != false (真理)所以: 字串 != 0 (有依據嗎??) [1]因為: 'hello' 是字串 (前提)因為: $num = 0 (前提)所以: 'hello' != $num
有依據嗎?好像有。
如果 A=B,B=C,那麼 A=C。
這就是我們經常使用的傳遞性,
同理:如果 A=B,B!=C,那麼 A!=C。
好像並沒有什麼錯誤。這就是我為什麼把它稱為想當然的知識遷移。PHP 手冊中,從來沒有說過比較子合傳遞性,沒有,從來沒有。
不僅僅是 PHP,任何語言都是,當你看到 A=B 並且 B=C 時,不要想當然的認為 A=C。
----------- 繼續更 2015-12-10 10:08:30 ---------------
題外話。
說說其它的幾個特性。
在 javascript 中,甚至有不滿足同一性的代碼。什麼是同一性,就是說:
如果 A,那麼 A=A
那 PHP 呢,還是繼續看那張圖:
我們看對角線。哇,都是 TRUE
,謝天謝地。
還有一個交換律:
如果 A=B,那麼 B=A
自己對照著表看吧。
用 ==
比較數字和字串時會將字串轉為數字再比較,PHP 轉換字串的規則是從字串開頭嘗試轉換為合適數字,例如 "123hello"
會轉換為 123
,而當字串開頭不是數字格式時則會轉換為 0
。
php是弱類型語言,當一個數字與一個字串比較時,會把字串轉換成數字,然後再進行比較,因此0與hello進行比較,他實際上在比較之前先將hello強制轉換成數字,而轉完恰好是0,因此這兩個用==比較符是相等的,如果要嚴格比較,可以使用===運算子
具體參考:
PHP 類型比較
PHP ==
類型不一樣的話,會轉換成同一類型,這個寫後面的字串會轉換成數值,參考
http://php.net/manual/en/language.operators.comparison.php
'hello' 由於前幾個字元不包含數字,所以轉換之後為 0,參考
http://php.net/manual/en/language.types.string.php#language.types.string.conversion
這個不是你認為的資料都變為boolean