空数组[]在布尔上下文中为false,其余所有数组(含null、0、空字符串等元素)均为true;判断仅依据元素个数,不递归检查内容。

PHP 8.0 中,数组在布尔上下文中会**自动转换为布尔值**,这个过程是隐式的,不需要写 (bool)。判断规则非常明确:只有空数组 [] 被视为 false,其余所有数组(包括含 null、0、空字符串等元素的数组)都视为 true。
空数组判定:仅 [] 为 false
PHP 官方定义的“假值”中,有一条就是“不包含任何元素的数组”。注意这个条件非常严格:
-
[]→ false -
[null]、[0]、[""]、[false]、[[]]→ 全部为 true(因为至少有一个元素) -
[1 => 'a'](带键的稀疏数组)→ true(哪怕键不是从 0 开始)
非空数组一律为 true,不看内容类型
PHP 不会递归检查数组内部值是否“全为假”,也不关心键名或元素类型。只要 count($arr) > 0,就直接判为 true:
-
['0', '', 0, false, null]→ true(5 个元素) -
['key' => []]→ true(1 个元素,值是空数组,但外层数组非空) -
array_merge([], [])→ false(结果仍是[])
和 null、可为空数组 ?array 的区别
这是容易混淆的关键点:隐式布尔转换只看数组本身是否为空,和变量是否为 null 无关。而 PHP 8.0 的联合类型 ?array 是类型声明层面的概念,不影响运行时布尔判断:
-
$arr = null;→if ($arr) {...}判为 false(因为null是独立假值) -
$arr = [];→if ($arr) {...}同样判为 false(因为空数组) -
$arr = null;与$arr = [];在if中行为相同,但类型不同:is_null($arr)和is_array($arr) && empty($arr)需分开验证
安全写法建议
依赖隐式转换易出错,尤其当变量可能为 null 或未定义时。推荐显式判断:
- 确认是数组且非空:
is_array($arr) && !empty($arr) - 允许
null或数组时:$arr !== null && is_array($arr) && $arr !== [] - 用
boolval()或!!$arr强制转布尔 —— 但注意它们仍遵循上述规则,不解决null和数组的歧义
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











