在 PHP 中,以下 **8 類值** 轉換為 bool 時結果為 false,其餘**全部為 true**:
| 類別 | 具體值 | 說明 |
|---|---|---|
| 布林值 | false | 字面值 |
| 整數 | 0 | 零值 |
| 浮點數 | 0.0 | 零值(含 -0.0) |
| 字串 | '' (空字串)、'0' | **注意:'0.0', '00', 'false' 皆為 true** |
| 陣列 | [] (空陣列) | 無任何元素 |
| 物件 | 無屬性物件 (PHP 4) | PHP 5+ 物件恆為 true(即使無屬性) |
| NULL | null、未定義變數 | 包含未 set 的變數 |
| SimpleXML | 無標籤的 XML 物件 | simplexml_load_string('<root/>') |
<?php
var_dump((bool) ""); // bool(false)
var_dump((bool) 1); // bool(true)
var_dump((bool) -2); // bool(true) 負數非零即 true
var_dump((bool) "foo"); // bool(true)
var_dump((bool) 2.3e5); // bool(true)
var_dump((bool) [12]); // bool(true) 非空陣列
var_dump((bool) []); // bool(false) 空陣列
var_dump((bool) "false"); // bool(true) 字串 "false" 非空非 '0'
var_dump((bool) "0.0"); // bool(true) 字串 '0.0' 不在 false 清單
var_dump((bool) "00"); // bool(true)
?>
$config = getConfig(); // 可能回傳 null、false、陣列
if ($config) { ... } // 等同於 $config !== null && $config !== false && $config !== []
?? (PHP 7+)$page = $_GET['page'] ?? 1; // 若 $_GET['page'] 為 null、未設定、空字串?注意:'' 視為 true,不會觸發 ??
// 正確寫法:
$page = (!empty($_GET['page']) && ctype_digit($_GET['page'])) ? (int)$_GET['page'] : 1;
empty() vs !$var| 值 | empty() | !$var | (bool)$var |
|---|---|---|---|
'' | true | true | false |
'0' | true | true | false |
0 | true | true | false |
0.0 | true | true | false |
'0.0' | false | false | true |
[] | true | true | false |
null | true | true | false |
false | true | true | false |
結論:empty() 與 !$var 行為一致,皆依據「轉 bool 為 false」判定。但 empty() 不會觸發「未定義變數」Notice,更安全。
if ($var === '')、if ($count === 0)、if ($arr === []) 比 if (!$var) 更易讀、更少 Bug。(bool)$row['is_active'] 或 $row['is_active'] == 1,避免字串 '0' 導致誤判。true/false(JSON boolean),避免 0/1、'Y'/'N' 造成前端判斷困擾。掌握 PHP **只有 8 種 false**,其餘皆 true 的鐵律,並養成**明確比較**習慣,能消除 90% 的布林判斷 Bug。