isset判断变量是否已声明且不为null,empty判断变量是否为等价于false的空值;前者不触发警告、不转换类型,后者静默处理未定义变量并隐式转换类型,“0”被判定为空是常见陷阱。

isset 判断变量是否已声明且不为 null;empty 判断变量是否“空值”,即等价于 false 的常见假值(包括 0、"0"、""、false、null、[] 等)。
isset 的核心行为
isset() 只关心变量是否存在且不是 null,不进行类型转换,也不触发任何警告:
- 未定义变量 → 返回
false(不会报 Notice) - 已定义且值为
null→ 返回false - 已定义且值为
0、false、""、[]→ 全部返回true - 支持多参数,仅当所有参数都满足条件才返回
true(如isset($a, $b))
empty 的核心行为
empty() 实际是语法糖,等价于 !$var(但不报未定义变量的 Notice),会做隐式类型转换:
- 未定义变量 → 返回
true(静默处理) - 值为
0、0.0、"0"、false、null、""、[]、new stdClass()(空对象在 PHP 5.5+ 视为非空,但通常不建议依赖)→ 返回true - 注意:
"0"被判为空,这是高频陷阱
关键区别对比表
以常见值为例:
立即学习“PHP免费学习笔记(深入)”;
| 变量值 | isset($v) | empty($v) |
|---|---|---|
| 未定义 | false | true |
null |
false | true |
0 |
true | true |
"0" |
true | true |
false |
true | true |
"" |
true | true |
[] |
true | true |
1 或 "hello"
|
true | false |
面试高频考点与避坑建议
-
别用 empty 判断数字是否为 0:比如表单提交
age=0,empty($_POST['age'])会误判为“没填” -
判断变量是否存在优先用 isset:尤其在访问数组键或对象属性前,如
isset($arr['name']) -
需要语义上“有内容”再用 empty:比如验证用户昵称是否为空字符串或假值,
empty(trim($name))更稳妥 -
替代方案更清晰:明确意图时,直接用
array_key_exists()、is_null()、strlen() > 0或严格比较(=== '')反而不易出错











