
PHP 中 empty() 判断数组时,最常被误解的是:它把空数组 [] 当作“空”(返回 true),但很多人误以为它只判断 null 或未定义变量,或混淆了它和 isset()、count() 的行为。
empty([]) 为 true 是设计如此,不是 bug
empty() 的语义是“值是否为‘空值’”,而 PHP 明确将空数组列为“空值”之一(和 null、false、0、"0"、"" 并列)。所以:
-
empty([])→true -
empty(['a' => 'b'])→false -
empty($undefined)→true(不报错)
这不是异常,而是语言规范。若你本意是“检查变量是否存在且非 null”,该用 isset();若想确认“数组有没有元素”,应直接用 count($arr) === 0 或 !$arr(因数组在布尔上下文中,空为 false)。
别用 empty() 替代 isset() 检查数组键
对数组的某个键做判断时,empty($arr['key']) 可能静默失败:
立即学习“PHP免费学习笔记(深入)”;
- 若
$arr本身未定义,empty($arr['key'])不报 Notice(看似安全),但掩盖了变量未初始化的问题 - 若
$arr存在但'key'不存在,empty($arr['key'])会触发Notice: Undefined index(除非错误报告关闭) - 若
$arr['key']值为0、false或"",empty()返回true,但这未必代表“键不存在”
正确做法是先确保数组存在,再检查键:isset($arr['key']) 或 array_key_exists('key', $arr)。
空数组 vs “假值数组”容易混淆
以下情况都让 empty($arr) 返回 true,但含义不同:
-
$arr = [];—— 真正的空数组 -
$arr = null;—— 变量为null -
$arr = false;—— 变量是布尔值false -
$arr = 0;—— 变量是整数0
如果你只关心“是不是空数组”,就不要依赖 empty(),而应组合类型与值判断:is_array($arr) && count($arr) === 0,或更高效地写成 is_array($arr) && !$arr(利用数组的布尔转换规则)。
替代方案推荐:按场景选函数
根据实际意图选择更明确的判断方式:
- 检查变量是否已定义且不为
null→isset($arr) - 检查数组是否为空(有无元素)→
count($arr) === 0或!$arr(仅限已知是数组时) - 检查数组是否为
null或非数组 →!is_array($arr) - 检查数组是否有某个键(不管值是什么)→
array_key_exists('key', $arr)
用 empty() 前,先问自己:我到底想排除哪些情况?它的宽松性常带来隐含逻辑,反而增加维护成本。











