没有万能函数,isset()判断变量是否已声明且不为null,empty()则额外将''、0、'0'、false、[]等视为“空”;安全判断需组合使用,如isset($var) && $var !== ''或PHP 7.4+的??运算符。

PHP 空值判断该用 isset() 还是 empty()?
直接说结论:没有万能函数,isset() 和 empty() 检查的不是同一类“空”,混用会出 bug。比如 empty('0') 返回 true,但 isset('0') 是 true;isset(null) 是 false,而 empty(null) 是 true —— 表面结果一致,底层逻辑完全不同。
关键区别在于:
-
isset()只判断变量是否已声明且不为null(注意:不关心值是否“语义为空”) -
empty()先做isset(),再额外把''、0、0.0、'0'、false、[]都算作“空”
怎么安全地兼容 null / '' / 0 / 未定义?
多数业务场景真正要问的是:“这个值有没有被赋一个有意义的、可使用的值?”——这得靠组合判断,不能只靠一个函数。
推荐写法(按优先级排序):
立即学习“PHP免费学习笔记(深入)”;
- 想严格区分
0和''(比如表单数字字段允许为 0):isset($var) && $var !== '' - 接受
0但拒绝null、''、false:isset($var) && $var !== null && $var !== '' && $var !== false - PHP 7.4+ 可用空合并运算符简化常见模式:
$val = $data['name'] ?? '';(仅解决未定义/NULL,不处理''或0) - 需要过滤掉所有“假值”但又不想误杀
0?别用empty(),改用显式比较:isset($var) && $var !== '' && $var !== null && $var !== false
为什么 is_null($var) || $var == '' 是危险写法?
这种写法看似直白,实际埋了两个坑:
-
$var == ''触发类型转换:0 == ''→true,false == ''→true,array() == ''→true(PHP 8.0+ 已弃用但旧版本仍存在) -
is_null($var)对未定义变量会报Notice: Undefined variable,而isset()不会 - 正确替代方案:
!isset($var) || $var === ''(注意是===)
PHP 8 的 str_contains() 和 is_countable() 能帮上忙吗?
不能直接解决空值判断问题,但能减少错误前提下的误判:
-
str_contains()要求第一个参数必须是字符串,传null或数组会直接报TypeError,反而暴露了数据污染问题 -
is_countable()比is_array() || is_object()更准确识别可遍历结构,避免对null或字符串调用count()导致 warning - 真正提升健壮性的做法是:在入口层(如 API 请求解析)就用
filter_var()或 DTO + 类型声明约束输入,而不是在业务逻辑里反复补救空值
最易被忽略的一点:数组键存在性检查不能只靠 isset($arr['key']) —— 如果 $arr['key'] = null,isset() 仍返回 false,此时应改用 array_key_exists('key', $arr)。











