PHP 是弱型別語言,0、'0'、''、null、false、[] 在鬆散比較 (==) 下均為 true,導致判斷「是否為 0」極易出錯。本文梳理各種判斷場景、正確寫法與常見陷阱。
| 值 | == 0 | === 0 | is_int() | empty() | isset() | strlen() |
|---|---|---|---|---|---|---|
0 (int) | true | true | true | true | true | 1 |
'0' (string) | true | false | false | true | true | 1 |
'' (空字串) | true | false | false | true | true | 0 |
null | true | false | false | true | false | Warning |
false | true | false | false | true | true | Warning |
[] (空陣列) | false | false | false | true | true | Warning |
<?php
$val = 0; // 來自資料庫、API、表單
// ✅ 推薦:嚴格比較 + 類型檢查
if (is_int($val) && $val === 0) {
echo "整數 0";
}
// ✅ 只要數值為 0(含 '0'、0.0)
if ((int)$val === 0) { ... }
// ❌ 錯誤:$val == 0 會誤判 null、false、'' 為 0
// ❌ 錯誤:empty($val) 會誤判 '0'、0.0、false 為空
?>
<?php
$str = '0';
// ✅ 嚴格比較
if ($str === '0') { ... }
// ✅ 正則/長度
if (strlen($str) === 1 && $str[0] === '0') { ... }
?>
<?php
// 表單提交 $_POST['age'] 可能為 '0'、''、未設定
// ✅ 存在且非空字串('0' 視為非空)
if (isset($_POST['age']) && $_POST['age'] !== '') { ... }
// ✅ 存在且非 null('0'、0、false 皆通過)
if (isset($_POST['age']) && $_POST['age'] !== null) { ... }
// ❌ empty($_POST['age']) 會將 '0' 視為空 → 錯誤拒絕合法輸入
?>
<?php
// 資料庫 numeric/decimal 欄位可能回傳 '0.00'、'0'
// ✅ 強制轉型後嚴格比較
if ((float)$row['amount'] === 0.0) { ... }
// ✅ 使用 bcmath 高精度比較(金融場景)
if (bccomp($row['amount'], '0', 2) === 0) { ... }
?>
===, !==),除非明確需要類型轉換語意。$age = (int)($_POST['age'] ?? 0); 後續邏輯只處理 int。empty() 判斷數值輸入,它將 '0'、0、0.0、false 視為空。NOT NULL DEFAULT 0,減少 null 干擾。0, '0', 0.0, -0, null, false, '', []。<?php
/**
* 判斷是否為整數零值
*/
function isIntZero(mixed $val): bool {
return is_int($val) && $val === 0;
}
/**
* 判斷是否為數值零值 (int/float/string numeric)
*/
function isNumericZero(mixed $val): bool {
if (is_numeric($val)) {
return (float)$val === 0.0;
}
return false;
}
/**
* 判斷變數是否「已設定且非空字串」('0' 視為有效)
*/
function isFilledString(mixed $val): bool {
return is_string($val) && $val !== '';
}
// 使用
var_dump(isIntZero(0)); // true
var_dump(isIntZero('0')); // false
var_dump(isNumericZero('0.00')); // true
var_dump(isFilledString('0')); // true
var_dump(isFilledString('')); // false
?>
PHP 判斷「是否為 0」的關鍵在於明確業務語意:是判斷整數型別的 0、數值上的零、還是字串 '0'。堅持「輸入端強型別轉換 + 邏輯層嚴格比較 + 封裝語意化函數」,即可避開弱型別陷阱,寫出可靠、可維護的代碼。