PHP 提供兩種比較運算子:==(鬆散比較)與 ===(嚴格比較)。混淆兩者是常見 Bug 來源,本文透過實例釐清差異並給出防錯建議。
| 運算子 | 比較行為 |
|---|---|
== | 僅比較值,會自動進行型別轉換(Type Juggling) |
=== | 同時比較值與型別,不進行轉換 |
$result = 0; // 函式回傳 0 表示「找到第 0 筆」或「數量為 0」
if ($result == false) {
// 這裡會進入!因為 0 == true 為 true
echo '視為失敗處理'; // 錯誤邏輯
}
if ($result === false) {
// 只有明確回傳 false 才會進入
echo '真正失敗'; // 正確邏輯
}
$a = '2'; // string
$b = 2; // int
var_dump($a == $b); // true (值相等,型別自動轉換)
var_dump($a === $b); // false (型別不同:string vs int)
strpos():找到位置 0 時回傳 0,未找到回傳 false。必須用 === false 判斷。array_search()、strstr() 等同理。$pos = strpos('abc', 'a'); // 0
if ($pos == false) { ... } // 錯:會誤判為未找到
if ($pos === false) { ... } // 正確
===,除非確定需要型別轉換語意。===。isset()、empty()、is_null() 等語意明確的檢查函式。strict_types=1 宣告,減少隱性轉換。0 == '' // true
0 === '' // false
'0' == 0 // true
'0' === 0 // false
null == false // true
null === false // false
[] == false // true
[] === false // false