=== 要求值和类型都严格一致,== 会进行隐式类型转换;如 0 == false 为 true 但 0 === false 为 false,函数返回值判错、表单验证等场景必须用 === 避免误判。

PHP里 == 和 === 到底差在哪
区别不在“多一个等号”,而在是否跳过类型转换。用 == 时,PHP会自动把两边转成相同类型再比;=== 则要求值和类型都完全一致。
常见错误现象:0 == false 返回 true,但 0 === false 是 false;"1" == true 成立,"1" === true 不成立。
- 使用场景:判断函数返回值是否为
false(比如fopen()失败)时,必须用===,否则0、""、null都会被误判为失败 - 参数差异:
==的隐式转换规则复杂,比如字符串开头是数字就取数字部分,"123abc"会被当成123 - 性能影响:理论上
===略快,因为不触发类型推导和转换,但实际差异可忽略
PHP中那些容易被忽略的比较陷阱
不是所有“看起来相等”的值,在PHP里真能用 == 安全判断。
典型例子:"0" == false 是 true,但 "0" == 0 也是 true,而 "0" === 0 是 false;再比如 array() == null 返回 true,但 array() === null 是 false。
立即学习“PHP免费学习笔记(深入)”;
-
null、0、""、false在松散比较下经常互相“打通”,尤其在表单验证或API响应判断时极易出错 - 浮点数慎用
==:0.1 + 0.2 == 0.3是false,因为二进制精度问题,应改用abs($a - $b) 类方式 - 对象比较:两个不同实例即使属性完全一样,
==可能返回true(取决于实现),但===永远是false
什么时候必须用 != 还是 !==
和等号对称,!= 是松散不等,!== 是严格不等。它们的坑和 ==/=== 一模一样,只是逻辑反过来。
常见错误现象:if ($var != null) 看似想排除空值,结果 $var = 0 或 $var = "" 也会进分支,因为它们“不等于 null”但语义上你可能想统一处理。
- 数据库查询结果判断常用:
if ($row !== false)比if ($row != false)更安全,避免把0行结果误当失败 - 函数返回布尔值时,比如
in_array()默认返回false找不到,此时用!== false才能区分false和0(如果数组含0) - 不要混用:写
==却配!==,逻辑容易绕晕,保持风格一致
PHP 8 的 match 表达式对比较的影响
match 默认使用严格比较(类似 ===),不进行类型转换,这是它和 switch 最关键的区别。
例如:match ("1") { 1 => "int", "1" => "string" } 会返回 "string";而 switch ("1") { case 1: ... } 会走 case 1 分支,因为 switch 内部用的是 ==。
- 使用场景:需要明确区分类型时(比如API路由根据字符串ID还是整数ID分发),
match更可靠 - 注意默认行为:
match不支持break,也不支持范围或条件表达式,别指望它替代复杂if链 - 兼容性:PHP 8+ 才有,老项目升级后要注意原有
switch逻辑是否被无意改变
事情说清了就结束











