必须用 === 而非 == 判断 php 空值,因 == 会隐式转换类型导致 ''、0、null、false 等互相误判;empty() 检测所有假值(含 '0'),=== null 才精准匹配 null 类型。

用 ===,不用 == 判断 PHP 空值 —— 否则会踩进类型隐式转换的坑里。
为什么 == 会导致误判
PHP 的 == 会先做类型转换再比较,而空值相关判断(如 ''、0、0.0、null、false)在松散比较下全等于彼此。比如:
var_dump('' == 0); // true
var_dump(0 == false); // true
var_dump(null == false); // true这意味着你本想检测“字符串是否为空”,结果传入数字 0 或布尔 false 也会触发相同逻辑,造成业务逻辑错乱。
empty() 和 === null 的适用场景差异
empty() 是语义化工具,但它是“假值”检测器,不是“空值”检测器;=== null 才是真正精准判断是否为 null 类型:
立即学习“PHP免费学习笔记(深入)”;
-
empty($var):对''、0、'0'、false、null、[]都返回true—— 注意:'0'字符串也会被判定为空 -
$var === null:只在变量严格等于null(且类型为null)时为true -
$var === '':只匹配空字符串,不接受0或false
所以:要判断“字段是否未设置或明确赋值为 null”,用 === null;要判断“用户输入是否无意义内容”,才考虑 empty(),但得额外处理 '0' 这类边界值。
API 参数校验中常见的错误写法
后端接收 JSON 数据时,常有人这样写:
if ($_POST['id'] == null) { /* 错! */ }这会把字符串 "0"、整数 0、甚至浮点 0.0 全部当成“空”,导致合法 ID 被拦截。正确做法取决于你想拒绝什么:
- 只拒绝
null:用$_POST['id'] === null - 拒绝
null和未定义:用!isset($_POST['id']) - 拒绝空字符串、
null、false等但允许'0':用strlen(trim($_POST['id'])) === 0 - 需要兼容数组/对象是否为空:用
is_array($v) && count($v) === 0,别依赖empty()
性能与可读性其实不冲突
有人担心 === 多敲一个等号影响效率或可读性,实际完全不必:
- PHP 对
===的优化早已成熟,和==性能差异可忽略 - 代码可读性反而更高:看到
=== null就知道开发者明确要匹配null类型,而不是靠猜测“这里想表达什么意思” - 静态分析工具(如 PHPStan)和 IDE 更容易推导类型,减少误报
真正容易被忽略的是:isset() 和 array_key_exists() 在处理数组键时行为不同 —— isset($arr['key']) 对 null 值返回 false,而 array_key_exists('key', $arr) 只看键是否存在,不管值是什么。这个细节在参数过滤时经常引发 bug。











