PHP 8.0中三元运算符?:将空数组[]视为falsy而触发假分支,空合并运算符??则仅处理null/未定义,对空数组透明;需按场景选用?:、??或显式类型+非空判断。

PHP 8.0 中,三元运算符(?:)对空数组的处理方式与 PHP 7 一致,但需特别注意其“**空值判定逻辑**”——它判断的是“是否为 falsy”,而空数组 [] 在 PHP 中是 falsy 值,因此会触发三元运算符的“假分支”。
空数组在三元运算符中被视为 false
PHP 将以下值视为 falsy:false、0、0.0、空字符串 ''、null、以及 空数组 [](注意:仅限索引空数组;含键的空数组如 ['a' => null] 仍是 truthy)。所以:
$arr = []; $result = $arr ?: ['default']; // 触发 false 分支 → $result = ['default']
想区分“null/未定义”和“空数组”?不能只靠 ?:
如果业务逻辑要求:仅当变量为 null 或未定义时才用默认值,而空数组应被保留(不替换),则 ?: 不适用,必须显式判断:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 用
isset($arr) && is_array($arr)确保变量存在且为数组 - 用
!empty($arr)判断是否为非空数组(但注意:empty([])返回true) - 更安全写法:
is_array($arr) ? $arr : ['default'](忽略 null,只认数组类型)
PHP 8.0 新特性:空合并运算符 ?? 也不解决空数组问题
?? 只检测 null 和未定义,对空数组完全透明:
$arr = []; $result = $arr ?? ['default']; // $arr 存在且不为 null → $result = [](原样保留)
所以若目标是“有数组就用,没数组才给默认”,?? 正确;若目标是“非空数组才用,空数组也算‘无效’”,仍得用 ?: 或自定义逻辑。
实用建议:按场景选操作符
- 要“空值兜底”(包括
null、''、[]、0等所有 falsy)→ 用?: - 要“仅 null/未定义兜底”,其他值(含
[])都照收 → 用?? - 要“仅数组类型兜底”,忽略类型错误 → 显式用
is_array($x) ? $x : $default - 要“非空数组才用”,否则兜底 →
is_array($x) && !empty($x) ? $x : $default
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










