PHP 8.1起支持字符串键关联数组解包,不再报错;解包时同名键后值覆盖前值,行为同array_merge;仅一层展开,不递归;PHP 8.1+可安全使用,更轻量直观。

因为 PHP 8.1 正式支持字符串键(即关联数组)的数组解包,底层限制被移除。
关键改动:关联数组解包从“禁止”变为“合法”
在 PHP 7.3–8.0 中,只有整数索引且连续的数组才能用 [...$arr] 展开。一旦数组含字符串键(如 ['host' => 'localhost']),PHP 就会抛出 Fatal error: Cannot unpack array with string keys。
PHP 8.1 的 RFC 明确取消了该限制,允许任何普通数组(包括纯关联数组、混合键数组)直接解包,只要它是可遍历的(array 类型即可)。
行为逻辑与 array_merge 一致
解包后同名字符串键的值按顺序覆盖:后出现的覆盖先出现的,和 array_merge() 的顶层合并规则完全相同。
$a = ['host' => 'localhost', 'port' => 3306];$b = ['host' => 'prod-db', 'debug' => true];$config = [...$a, ...$b]; // ['host'=>'prod-db', 'port'=>3306, 'debug'=>true]
注意:仅限一层展开,不递归
解包不会深入子数组合并。例如:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
$a = ['db' => ['host' => 'local']];$b = ['db' => ['port' => 3306]];-
[...$a, ...$b]结果是['db' => ['port' => 3306]]—— 整个'db'键被后者完全替换
如需深层合并,仍需 array_merge_recursive() 或自定义逻辑。
兼容性与使用建议
只要运行环境是 PHP 8.1 或更高版本,关联数组解包就是安全可用的语法。它比 array_merge() 更轻量、更直观,特别适合配置覆盖场景。
旧版本代码若迁移到 8.1+,原来报错的地方可直接去掉 array_merge() 调用,改用展开运算符,无需额外判断键类型。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










