PHP 8.1 允许对关联数组使用展开运算符(...)合并,字符串键原样保留、后覆盖前,数字键按位置展开不重排,等价于 array_replace() 而非 array_merge(),但不支持函数调用时按键名解构。

PHP 8.1 支持对关联数组使用展开运算符(...)进行合并,但有一个关键前提:数组必须是可遍历的(即实现 Traversable 接口),且键名需能被正确保留——而原生关联数组本身满足这一条件。
不过要注意:PHP 8.1 并未改变展开运算符对关联键的处理逻辑,它延续了 PHP 7.4 引入的行为——在数组字面量中展开关联数组时,字符串键会被原样保留,数字键则按位置展开,不重排、不覆盖(与 + 运算符不同)。
✅ 正确用法:在数组定义中展开关联数组
$confA = ['host' => 'localhost', 'port' => 3306]; $confB = ['port' => 5432, 'charset' => 'utf8']; $merged = [...$confA, ...$confB]; // 结果:['host' => 'localhost', 'port' => 5432, 'charset' => 'utf8']
-
...$confA将$confA的每个键值对“铺开”进新数组; -
...$confB紧随其后,同名字符串键(如'port')会被后者覆盖; - 这行为等价于
array_replace($confA, $confB),但语法更直观。
⚠️ 注意:这不是
array_merge()。array_merge()会重排数字键、且对同名字符串键也是后覆盖前;而...展开在关联数组场景下效果类似array_replace,但不递归。
PHP 8.5.12下载修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
❌ 常见误区:试图在函数调用中“解构”关联数组传参
function connect($host, $port) { /* ... */ }
$config = ['host' => '127.0.0.1', 'port' => 3306];
// ❌ 错误!...$config 不会按键名映射参数
connect(...$config); // 实际传入 connect('127.0.0.1', 3306),顺序依赖数组内部顺序
// ✅ 正确方式:显式提取或改用命名参数(PHP 8.0+)
connect(host: $config['host'], port: $config['port']);
展开运算符 不支持按键名自动绑定函数参数,它只按值的位置展开。
? 多个关联数组合并(任意位置 + 混合类型)
$base = ['debug' => true]; $env = ['host' => 'prod.example.com']; $opts = ['timeout' => 30, 'retries' => 3]; $full = ['app_name' => 'api', ...$base, 'version' => 'v2', ...$env, ...$opts]; // 结果: // [ // 'app_name' => 'api', // 'debug' => true, // 'version' => 'v2', // 'host' => 'prod.example.com', // 'timeout' => 30, // 'retries' => 3 // ]
- 字符串键全程保留;
- 同名键后出现者生效;
- 可与其他字面量混合,位置自由。
? 对比其他合并方式(关键区别)
| 方法 | 字符串键冲突 | 数字键处理 | 是否递归 | 适用场景 |
|---|---|---|---|---|
[...$a, ...$b] |
后覆盖前 | 按值展开,不重编号 | 否 | 简洁合并、配置覆盖 |
$a + $b |
左优先(不覆盖) | 右侧重复数字键被丢弃 | 否 | 需保留左侧键结构 |
array_merge($a, $b) |
后覆盖前 | 所有数字键重排为 0,1,2… | 否 | 纯索引数组拼接 |
array_replace($a, $b) |
后覆盖前 | 数字键不重排(保留原索引) | 否 | 安全替换顶层配置 |
array_replace_recursive($a, $b) |
后覆盖前 | 逐层递归处理嵌套 | 是 | 深度合并多维配置 |
PHP 8.1 的展开运算符让关联数组合并变得更轻量、更符合直觉,尤其适合构建配置、API 参数或模板上下文。只要记住它不是万能解构,也不替代递归合并,就能用得又准又稳。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











