"0" === 0 返回 false,因为 === 要求类型和值都严格相等,而 "0" 是字符串、0 是整数,类型不同直接返回 false,不进行类型转换。

PHP中"0" === 0为什么返回false
因为===是严格相等运算符,要求值和类型都完全一致。"0"是字符串类型,0是整数类型,类型不同直接判定为false,不进行任何类型转换。
==和===在数字字符串比较时的行为差异
松散相等==会尝试类型转换,而===不会。PHP对"0"这类纯数字字符串转整数的结果是0,所以"0" == 0为true;但类型始终不同,"0" === 0恒为false。
-
"0" == 0→true(字符串被转换为整数0后比较) -
"0" === 0→false(string≠int) -
"0" == false→true(字符串转布尔:非空字符串本应为true,但"0"是唯一例外,被PHP特殊处理为false) -
"0" === false→false(类型不同,且"0"不是布尔值)
容易踩坑的典型场景
从表单或API接收的数字常以字符串形式存在(如$_GET['id']),若用===与整数硬比,哪怕值看起来一样也会失败。尤其在条件判断、数组键查找、in_array()默认模式下极易出错。
- 写
if ($_GET['status'] === 1)永远不成立,因为$_GET['status']是string -
in_array("0", [0, 1, 2])默认返回true(松散匹配),但in_array("0", [0, 1, 2], true)返回false(严格模式) - 用字符串做数组键:
$arr["0"] = 'a'; $arr[0]能取到值(PHP自动转换),但isset($arr["0"]) && isset($arr[0])都为true,类型混用易引发逻辑混乱
安全又明确的处理方式
需要数值比较时,显式转换类型比依赖隐式行为更可靠。优先用===,但前提是确保两边类型一致。
- 转整数:
(int) $_GET['id'] === 123或intval($_GET['id']) === 123 - 转字符串:
(string) $id === "123"(适合校验格式,比如带前导零的编号) - 用
filter_var()做带验证的转换:filter_var($_GET['id'], FILTER_VALIDATE_INT) === 123(失败时返回false,不会静默转成0) - 避免对
"0"单独做布尔判断,改用strlen($str) > 0 && $str !== "0"之类显式逻辑
最常被忽略的一点:PHP把"0"当作false只发生在布尔上下文中(如if ("0")),但它既不是0也不是false——类型才是决定===结果的唯一因素。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











