empty()检测8种语义空值(含"0"、false等),is_null()仅识别null;判断变量存在用isset(),业务校验需结合类型函数精准判断。

直接说结论:判断变量是否“为空”,empty() 和 is_null() 完全不是一回事——前者测的是“语义上的空值”,后者只认一种状态:null。用错会导致逻辑漏洞,比如把 0、"0"、false 当成 null 处理。
什么时候该用 is_null()
只在你**明确想确认变量是否被赋值为 null** 时才用它。它不关心其他任何“看起来空”的值。
-
is_null(null)→true(唯一返回true的情况) -
is_null(0)、is_null("")、is_null(false)、is_null([])→ 全是false - 常见误用场景:检查函数返回值是否失败,但函数其实返回的是
false或0(比如strpos()找到开头位置时返回0),这时用is_null()会漏判
什么时候该用 empty()
empty() 是 PHP 里最常被误解也最常被滥用的函数之一。它检测的是“在条件判断中会被当作 false 的值”,共 8 种:
nullfalse-
0(整型零) -
0.0(浮点零) -
""(空字符串) -
"0"(注意!字符串"0"也被认为是empty) -
[](空数组) - 未定义变量(如
empty($undefined)不报 Notice)
所以它适合用于表单提交后快速过滤“用户没填/没选”的字段,但不适合做精确类型判断。
立即学习“PHP免费学习笔记(深入)”;
isset() 和 !empty() 的实际分工
很多开发者以为 !empty($x) 就等于 isset($x) && $x,其实不对:empty() 对未定义变量静默返回 true,而 isset() 才是真正用来“确认变量存在且非 null”的函数。
-
isset($x)→ 变量已声明、不是null(哪怕它是0、false、"") -
!empty($x)→ 变量存在且不满足上面那 8 种“空”情况(但它对未定义变量不报错,这点容易掩盖问题) - 典型坑:用
!empty($_POST['id'])接收 ID,结果用户真提交了字符串"0",就被当成空跳过了 - 更安全的做法:先
isset($_POST['id'])确保字段存在,再按业务判断值是否合法(比如is_numeric()+(int)$_POST['id'] > 0)
PHP 8.0+ 的新选择:is_countable()、is_iterable() 这类函数提醒你
PHP 越来越强调显式类型意图。empty() 和 is_null() 都是弱类型的“模糊判断”,而现代写法倾向拆解需求:
- 要确认变量存在且有值?→
isset($x) - 要确认是数组且非空?→
is_array($x) && !empty($x)或count($x) > 0 - 要确认是字符串且非空?→
is_string($x) && $x !== ""(注意别用!empty($x),否则"0"被误杀) - 要确认是数字且非零?→
is_numeric($x) && (int)$x !== 0(比!empty()更准)
真正麻烦的从来不是函数本身,而是你没想清楚“我到底在检查什么”——是变量是否存在?是否为 null?是否为假值?是否为空集合?是否为有效业务数据?每个问题对应不同工具。



















