
=== 和 == 在 php 里到底差在哪?
区别不在“严不严格”,而在“要不要类型转换”。== 会先尝试把两边转成同一种类型再比较,=== 跳过这步,类型不同直接判 false。
比如 0 == "0" 是 true,但 0 === "0" 是 false;又比如 NULL == false 是 true,null === false 是 false。
哪些场景下 == 容易出人意料?
常见于用户输入、数据库返回值、json 解析结果这类“字符串型数字”或“混合类型数据”的判断。
-
"0" == false→true(字符串转布尔:非空即 true?错,PHP 特殊规则:字符串"0"转布尔是false) -
0 == ""→true(空字符串转整数是 0) -
1 == true→true,但2 == true也是true(true 转整数是 1,所有非零数 == true) - 从 mysql 查询返回的
tinyint(1)字段,PHP 可能作为字符串或整数传回来,用==判断状态码(如1 == "1"没问题,但1 == "01"就翻车)
什么时候必须用 ===?
只要你在乎“值对 + 类型对”,就必须用 ===。这不是风格问题,是逻辑安全问题。
立即学习“PHP免费学习笔记(深入)”;
- 函数返回值检查:
strpos($str, 'x') === false(不能用== false,因为位置 0 也是合法返回值,而0 == false成立) - 配置开关或状态码比对:
$config['debug'] === true(避免字符串"1"或整数1被误认为开启) - 数组键存在性判断:
array_key_exists('id', $_GET) && $_GET['id'] !== ''配合===做精确非空校验 - JSON 解析后判断:
json_decode($json, true)返回null表示解析失败,此时json_last_error() === JSON_ERROR_NONE才可靠
性能和兼容性有影响吗?
几乎没有。PHP 内部对 === 的处理比 == 更轻量——少一次类型推导和转换。PHP 5.4+、7.x、8.x 全系行为一致,不存在兼容性坑。
唯一要注意的是:别在写框架或公共库时为了“省字符”用 ==,调用方无法预判你的输入类型。真实项目里,=== 应该是默认选择,== 属于需加注释的例外。
类型松散不是便利,是隐式契约。你没写明要转什么类型,PHP 就按自己那套规则来,而那套规则连官方文档都得专门开一节叫“Comparison with Various Types”。