簡單的一個判斷式, 如下述:
<?php $types = 0; if ($types == 'abc') echo 'a'; else echo 'b'; ?>
答案是印出 a (預期應該要印出 b, 結果卻印出 a)
- 註1: 這種情況平常比較容易出現在會給預設值的地方, ex: function abc($input, $types = 0) {...}
- 註2: 目前確定 PHP 5.3, 5.4 都是這樣子的狀況, 看官方說明這個並不算是 Bug, 應該會一直持續下去.
PHP 判斷式 0 == 'string' 恆為 true 的解法
先講解法:
- 使用 === 來解決. (註: === 會比對 "型態 + 值" 是否相同, 詳見: PHP: Comparison Operators - Manual)
- 上面 === 是正解, 另外就是 盡量避免預設值 設為 0 或 False(雖然這樣子講怪怪的, 因為預設值設為 0 / False 是很習慣的事情. XD), 或者說, 設 0 或 False 的, 要特別注意.
- 註: 可以考慮 預設值設 -1
- 判斷式 盡量用 === 來判斷
範例 + 測試
<?php $a = 0; echo ($a === 'abc') ? "0 === abc\n" : "0 !== abc\n"; $a = 0; echo ($a == 'abc') ? "0 = abc\n" : "0 != abc\n"; $a = 1; echo ($a == 'abc') ? "1 = abc\n" : "1 != abc\n"; $a = false; echo ($a == 'abc') ? "false = abc\n" : "false != abc\n"; $a = true; echo ($a == 'abc') ? "true = abc\n" : "true != abc\n"; $a = '0'; echo ($a == 'abc') ? "'0' = abc\n" : "'0' != abc\n"; $a = 'a'; echo ($a == 'abc') ? "a = abc\n" : "a != abc\n"; ?>
執行結果
- 0 !== abc
- 0 = abc
- 1 != abc
- false != abc
- true = abc
- '0' != abc
- a != abc
PHP 判斷式 0 == 'string' 恆為 true 問題追蹤 與 說明
這個問題在 2006年(PHP 5.2版)就已經有被人提到了, 但是都不被列為 Bug + Wont fix (下述為 Bug list), 官方文件有詳細說明.
- Bug #39579 Comparing zero & string values in boolean comparison has unexpected behaviour
- Bug #44999 0 equals any string
- Bug #44990 array('word')==array(0) -- true # 此篇有講解法
use ===
'word' is converted to an integer for the comparison, and thus 0 == 0.
try this code:
if(array('word')===array(0)) echo "ERROR"; - Bug #50696 number_format when passed a 0 as first function argument, returns null # 此篇下面有 某人 與 Rasmus 的熱烈討論
下述摘錄自 官方文件說明: PHP: Strings - Manual - String conversion to numbers
The value is given by the initial portion of the string. If the string starts with valid numeric data, this will be the value used. Otherwise, the value will be 0 (zero). Valid numeric data is an optional sign, followed by one or more digits (optionally containing a decimal point), followed by an optional exponent. The exponent is an 'e' or 'E' followed by one or more digits.
- 簡單說 0 == "string" 會恆為 true 的原因就是:, 因為字串轉換成 integer 會變成 0 (使用 strtod() 來作 ATOI 的時候, 無法轉換 就會變成 0), 所以用 === 解決.
- 詳細可見: "man 3 strtod" - strtod, strtof, strtold - convert ASCII string to floating-point number
相關網頁
- php string comparasion to 0 integer returns true?
Use comparison operator with type check "===". Look here for the example http://php.net/manual/en/language.operators.comparison.php and explanation why not-numerical string compared to zero always returns true.