0 == false 返回 true,因为松散比较会将 false 转为 0,变成 0 == 0;常见与 false 松散相等的值包括 0、""、null、[]、"0";而 === 要求类型和值均相同,故 0 === false 为 false。

0 == false 为什么返回 true
因为 == 是松散比较,PHP 会先尝试把两边转成相同类型再比值。当 false 参与 == 运算时,它会被隐式转为整数 0;而左边的 0 已是整数,所以最终变成 0 == 0,结果自然是 true。
哪些值和 false 松散相等
这不是 0 和 false 的“特殊关系”,而是 false 在松散比较中会被统一转成 0,从而和所有能转成 0 的值“意外相等”。常见情况包括:
-
0 == false→true(false→0) -
"" == false→true(空字符串 →0) -
null == false→true(null→0) -
[] == false→true(空数组 →0) -
"0" == false→true(字符串"0"→ 整数0)
用 === 就不会这样
=== 要求值和类型都一致,0 是整数,false 是布尔值,类型不同,所以:
-
0 === false→false -
"" === false→false -
null === false→false -
[] === false→false
只要涉及 0、false、null、""、[] 这类“falsy 值”的判断或比较,=== 才是安全选择。
立即学习“PHP免费学习笔记(深入)”;
最容易被忽略的坑:表单输入和 API 返回
用户传来的 $_GET['id'] 或 JSON 解析后的字段,表面看是数字,实际可能是字符串 "0"。这时写 if ($_GET['id'] == 0) 看似没问题,但一旦 $_GET['id'] 缺失或为 false、null、"",也会进 if 分支——因为它们全被转成 0。
- 正确做法:
is_numeric($_GET['id']) && (int)$_GET['id'] === 0或更稳妥地用filter_var($_GET['id'], FILTER_VALIDATE_INT) === 0 - 更通用原则:对任何外部输入做松散比较前,先确认你是否真的需要类型转换逻辑
类型隐式转换不是 bug,但它的行为路径太长,容易漏掉中间某一步的转换结果。真要靠它工作,得把整套转换规则背下来;而用 ===,你只需要盯住两个值本身。



















