
PHP 的布尔类型变量只有两个可能值:true 和 false,不是 1/0,也不是字符串 "true"/"false",更不是空或非空——它就是逻辑真与假的原生表示。
为什么 var_dump($x) 显示 bool(true) 而不是 int(1)
因为 PHP 将布尔类型作为独立标量类型处理,和整型、字符串严格区分。即使你在条件判断中写 if (1) 或 if ("hello"),它们会被隐式转换为布尔值,但变量本身类型没变。
-
is_bool($x)只对真正用true或false赋值的变量返回true;is_bool(1)是false - 函数返回布尔值时(比如
file_exists()、in_array()),别用== 1判断,该用=== true或直接放进if - JSON 编码时
json_encode(true)输出"true"(小写),而json_encode(1)是"1",类型错位会导致前端解析失败
empty() 和 isset() 对布尔变量的反应很反直觉
这两个函数不看布尔值本身,而是看“是否为空”或“是否已声明且非 null”。所以 empty(false) 返回 true,isset($b) 在 $b = false 时是 true —— 因为 false 是有效值,不是未定义,也不是 null。
-
empty(false)→true,但$b === false才是检查它是否为假值 -
isset($b)对$b = false、$b = 0、$b = ""全部返回true - 想确认变量存在且明确为
false?必须写isset($b) && $b === false
从数据库或 JSON 读取后,true/false 容易变成字符串
MySQL 的 TINYINT(1) 常被当布尔用,但 PDO 默认返回整数;JSON 中的 true 解析后是布尔,但如果字段被拼接进字符串或经过 strval(),就悄悄变成 "1" 或 ""。
立即学习“PHP免费学习笔记(深入)”;
- PDO 查询时加
PDO::ATTR_EMULATE_PREPARES => false并设置PDO::MYSQL_ATTR_FOUND_ROWS => true仍不能保证布尔字段类型,得手动 cast:(bool) $row['active'] -
json_decode('{"flag":true}', true)中$data['flag']是true;但若 JSON 来自 curl 且响应头没设Content-Type: application/json,PHP 可能当字符串处理 - API 接收参数时,
$_GET['debug']永远是字符串,$_GET['debug'] === 'true'才安全,不能直接当布尔用
布尔类型看着简单,但混在类型自动转换、外部数据输入、函数返回约定里,最容易漏掉一次 === 或多写一个 (bool) 强转——结果就是某个 if 分支永远不进,或者某个 API 返回了意外的 null。











