isset()检查变量是否已声明且不为null,empty()则将0、"0"、false、""、[]等均判为“空”;前者防未定义警告,后者用于业务逻辑空值判断。

isset() 和 empty() 的核心区别
判断变量是否“为空”,首先要分清你关心的是“变量是否存在”还是“值是否为逻辑空”。isset() 检查变量是否已声明且不为 null;empty() 则进一步把 0、"0"、false、""、[] 等都当作“空”来处理——这是最常混淆的点。
比如:$var = 0;,isset($var) 返回 true(变量存在且不是 null),但 empty($var) 返回 true(因为 0 被判定为空)。
- 用
isset()防止未定义变量警告,适合表单字段是否存在 - 用
empty()做业务逻辑上的“空内容”判断,比如用户没填手机号 -
empty()会静默转换类型,"0"字符串也会被当空,这点极易踩坑
is_null() 和 == null 的陷阱
is_null() 是唯一严格只检测值是否为 null 的函数,它不会做类型转换。而 == null 会触发松散比较,导致 0、false、"" 全部返回 true,几乎等同于 empty()。
示例:$var = false;,is_null($var) 是 false,但 $var == null 是 true(PHP 自动转成整数比较)。
立即学习“PHP免费学习笔记(深入)”;
- 需要确认变量是否明确赋值为
null,只用is_null() - 绝对不要用
== null或=== null替代isset(),前者不检查变量是否已定义 -
=== null在变量已定义前提下可用,但一旦变量未声明就会报Notice: Undefined variable
strlen() 和 array_key_exists() 的适用场景
当你要判断的不是“是否为空”,而是“是否为空字符串”或“数组键是否存在”,就得换方法。比如表单提交了 phone=(空字符串),empty() 会认为是空,但你可能想区分“没传字段”和“传了但为空”。
-
strlen(trim($str)) === 0可精确判断字符串是否真正为空白(含空格) -
array_key_exists('key', $_POST)能识别出$_POST['key']是否被提交,哪怕它的值是""或0 -
isset($_POST['key'])在$_POST['key'] = ""时仍返回true,但empty($_POST['key'])是true
PHP 8.0+ 中的 nullsafe 操作符与 ?? 运算符
在链式调用中检测空值,?-> 可避免层层 isset()。而空合并运算符 ?? 提供默认值,比 ?: 更安全——它只在左侧为 null 时生效,不会吞掉 0 或 false。
例如:$name = $user?->profile?->name ?? 'Anonymous';,如果 $user 或 $user->profile 是 null,整条表达式直接短路返回默认值,不报错。
-
??不等于?::$x = 0 ?: 'default'得到'default',但$x = 0 ?? 'default'得到0 -
?->只适用于对象属性/方法,对数组无效;数组要用$arr['key'] ?? null配合isset() - 这些新语法不能替代传统判断,只是让特定场景更简洁——别为了用而用
"0" 和数字 0 的语义差异,以及 empty() 对它们一视同仁。业务上要区分“用户输入了数字 0”和“用户什么都没填”,就必须绕开 empty(),改用 isset() + 类型判断或显式比较。











