应根据语义选择:检查变量是否已定义且非null用isset(),判断逻辑空值需区分场景——字符串用=== ''或strlen(),数字"0"为有效值,数组判空优先count()===0,复杂类型用===严格比较。

isset() 和 empty() 到底该用哪个
判断变量是否“为空”,PHP 里最常踩坑的就是混用 isset() 和 empty()。它们根本不是一回事:isset() 只管变量是否存在且不为 null;empty() 则会把 0、"0"、false、[] 都当成“空”——这在表单校验或 API 参数检查时极易出错。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 检查变量是否已定义且非
null(比如防止Notice: Undefined variable),用isset($var) - 检查值是否“逻辑上为空”(如用户没填、提交了空字符串),优先用
$var === ''或trim($var) === '',而不是无脑empty($var) -
empty($var)在数组判空时看似方便,但empty([])为true,而empty([''])也为true——后者其实含一个空字符串元素,容易误判
字符串空值检测别被 "0" 坑了
用户输入数字 "0" 是常见场景,比如年龄字段填了 0,但 empty("0") 返回 true,!$str 同样失效。这不是 bug,是 PHP 类型转换规则决定的——但业务上,“0” 往往是有效值。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 对明确是字符串的变量,用
strlen($str) === 0或$str === '' - 若需兼容 null/undefined,写成
!isset($str) || $str === '' - 接收 POST 数据时,
$_POST['age']可能是"0"、""或根本不存在,三者语义不同,应分开处理,不能一招empty()打天下
数组判空:count() vs empty() vs isset()
empty($arr) 看起来简洁,但它对 0 元素敏感;isset($arr) 只能告诉你变量存在,不反映内容;count($arr) === 0 最直白,但有性能顾虑?其实 PHP 7.2+ 对空数组的 count() 已优化为 O(1),基本无开销。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 要确认数组存在且一个元素都没有,用
is_array($arr) && count($arr) === 0 - 避免
empty($arr)—— 它在$arr = [0]时返回true,但这个数组明明有值 - 如果只是防未定义,
isset($arr)+is_array($arr)组合更稳妥,尤其在函数参数默认值为null的场景
NULL、false、0、"" 混在一起时怎么安全比较
当变量来源复杂(比如数据库字段允许 NULL,API 返回可能为 false),直接用 == 或 ! 会触发隐式类型转换,0 == false、"" == false 都为 true,但业务上它们含义天差地别。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 用严格等于
===明确比对类型和值,例如$var === null、$var === '' - 需要统一归为“无效值”处理时,不要自己写大段
if ($var === null || $var === '' || $var === false),改用filter_var($var, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) === null更可控(但注意这会把"0"当 false) - 最省心的方式:在数据进入业务逻辑前就做清洗,比如用
filter_input()或自定义验证器,把 “空” 显式转成null或抛异常,别留着模糊状态往后传
真正麻烦的从来不是语法怎么写,而是你得想清楚:“空”在这一次上下文中到底指什么——是没传?是传了但没内容?还是传了但值为零?同一份代码里混用多种判空逻辑,后面维护的人会花三倍时间猜本意。











