PHP中==会自动类型转换,===要求值和类型都严格一致;例如"0"==0为true但"0"===0为false,false==0、null==0、""==0均为true,而它们与0的===比较全为false。

PHP中==会自动类型转换,===不转、只认值+类型完全一致——这不是风格偏好,而是你是否允许PHP替你做决定。
为什么==会让"0"、false、null、""都等于0
因为==的规则是:先尝试把两边转成同一类型再比。字符串"0"转整数是0;空字符串""转整数也是0;false转整数是0;null转整数还是0。所以它们在== 0时全为true。
-
$_GET['id'] == 0可能误判?id=(空)、?id=false、?id=null,甚至?id=abc(转成0) -
in_array("0", $arr)默认用==,若$arr = [0, false],结果是true,但你本意可能是查字符串"0" - JSON解析后
json_decode('{"count":"0"}')->count == 0为true,但===立刻暴露类型不匹配
===在对象比较时不是“更严格”,而是“换了一套逻辑”
对对象来说,==和===都不比较属性值——它们都只看是否指向同一个内存地址(即是否是同一实例)。也就是说:
-
$a = new StdClass(); $b = new StdClass(); $a == $b→false -
$a = new StdClass(); $b = $a; $a === $b→true(因为是同一引用) - 想比属性内容?得手写遍历或用
json_encode($a) === json_encode($b)(仅限简单结构)
哪些地方必须用===,否则逻辑直接崩
涉及false、0、null、""这组“falsy值”的判断场景,==几乎必然出错:
立即学习“PHP免费学习笔记(深入)”;
-
strpos($str, 'x')返回0(找到在开头)或false(没找到),必须写strpos(...) === false,写== false会把位置0也当失败 -
filter_var($input, FILTER_VALIDATE_INT)失败返回false,成功返回整数,用=== false才能准确区分 -
$_POST['submit'] == '1'可能被$_POST['submit'] = 0或''绕过,应改为$_POST['submit'] === '1'(前提是确认输入是字符串)
最常被忽略的一点:用===并不能防止你传入错误类型的值,它只是忠实地告诉你“这俩真不一样”。问题根源往往在上游——比如$_GET来的永远是字符串,而你却拿它和整数===比,那永远是false。先明确数据契约,再选运算符。



















