PHP 7.3 不支持空数组与引用赋值的混合解构,因解构要求右侧为非空、结构匹配的数组,且不支持 & 符号;正确做法是先用 ??= 初始化键,再用 & 显式引用。

PHP 7.3 并不支持“定义空数组与引用赋值的混合解构”——这种写法在语法上不存在,也不符合 PHP 数组解构的设计逻辑。解构赋值(如 [$a, $b] = $arr 或 ['key' => $v] = $arr)要求右侧必须是**已存在且结构匹配的数组**,不能一边声明空数组、一边同时解构赋值。
解构的前提:右侧必须是非空、可遍历的数组
解构不是变量声明语法,而是“从已有数组中提取值”的操作。以下写法均会报错:
-
[$x, $y] = [];→ Warning: Undefined array key,PHP 8+ 直接 Fatal error -
['name' => $n] = [];→ Fatal error: Uncaught Error: Cannot use empty array for list assignment -
[$a, &$b] = [1, 2];→ 解构本身不支持 & 引用符号,&$b是非法语法
想实现“安全初始化 + 引用后续修改”,得拆成两步
若目标是:先确保数组键存在,再让某个变量引用其值(以便后续修改影响原数组),正确做法是:
- 用
??=初始化缺失键:$data['count'] ??= 0; - 再用引用赋值提取:
$ref =& $data['count']; - 之后修改
$ref会同步更新$data['count']
嵌套数组解构时,空子数组要单独处理
例如想解构 $user['profile']['avatar'],但 $user['profile'] 可能未定义:
立即学习“PHP免费学习笔记(深入)”;
- ❌ 错误:
['profile' => ['avatar' => $avatar]] = $user;→ 若$user['profile']不存在,直接报错 - ✅ 正确:先保障结构存在:
$user['profile'] ??= [];,再解构:['avatar' => $avatar] = $user['profile'];
替代方案:用 extract()?不推荐
虽然 extract($arr) 能批量导入变量,但它无法控制引用、不校验键名、易覆盖已有变量,且对用户输入有严重安全风险。PHP 官方文档明确不建议在不可信数据上使用。真正需要引用语义时,应显式用 & 绑定,而非依赖解构。



















