PHP展开运算符要求所有被展开变量必须是数组或可遍历对象,否则触发Fatal error;空数组合法,但null、字符串等非数组类型会报错。

不会报错,但前提是所有被展开的变量本身是数组(包括空数组)。
展开运算符要求所有操作数必须是数组
PHP 8.2 中的展开运算符 ... 只能用于数组或可遍历对象(Traversable),且在函数调用或数组字面量中使用时,每个被展开的值都必须是数组类型。如果传入 null、字符串、整数或未定义变量,会直接触发 Fatal error:
-
array_merge(...[$a, $b])—— 若$a是null或'abc',报错:Fatal error: Uncaught TypeError: array_merge(): Argument #1 ($array) must be of type array, string given -
[...$a, ...$b]—— 同样要求$a和$b都是数组,[](空数组)完全合法
空数组是安全的,但不能“假装”是数组
空数组 [] 或 array() 是标准数组,展开无问题:
-
$result = [...[], ...['x' => 1]];→['x' => 1] -
$result = [...[], ...[]];→[]
但以下写法会出错,因为 ''、null、0 不是数组:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
立即学习“PHP免费学习笔记(深入)”;
-
[...'']→ Fatal error -
[...null]→ Fatal error -
[...$undefined]→ Notice + Fatal error(未定义变量先触发 notice,再因 null 展开失败)
动态合并多个数组时的稳妥写法
当数组来源不确定(如表单字段、API响应),建议先过滤和兜底:
- 用
array_filter($arrays, 'is_array')剔除非数组项 - 对可能为
null的变量用空数组兜底:$arr = $arr ?? [] - 组合使用:
array_merge(...array_filter([$a, $b, $c], 'is_array'))
和 array_merge 的行为一致,但更严格
展开运算符本质上是 array_merge 的语法糖,二者在键处理逻辑上完全相同:
- 数字键会被重排(从 0 开始连续编号)
- 字符串键冲突时,后出现的值覆盖前面的值
- 都不支持原地修改,始终返回新数组
区别在于:展开运算符在参数校验上更早、更硬性——它在解析阶段就拒绝非数组,而 array_merge() 至少会执行并发出 warning(PHP 8.2 默认仍为 warning,非 fatal,但已不推荐依赖)。


















