array_merge() 本身不会抛 TypeError,传 null 仅触发 Warning 并返回 null;TypeError 实际源于后续对 null 结果的数组操作或严格类型声明上下文中的参数传递错误。

PHP 8.0 给 array_merge() 传 null 不会报 TypeError,而是触发 Warning 并返回 null;真正报 TypeError 的情况,通常是启用了严格类型检查(如声明了参数类型)或误用了其他函数/上下文。
你看到的 TypeError 很可能不是 array_merge() 本身抛出的,原因有以下几种常见情形:
array_merge 本身的错误行为是 Warning,不是 TypeError
-
array_merge()是弱类型函数,不强制参数为数组类型。 - 传入
null、字符串、整数等非数组值时,PHP 会发出:Warning: array_merge(): Expected parameter 1 to be an array, null given
- 函数返回
null(不是抛异常),且后续若用foreach或count()处理该返回值,才可能引发TypeError(比如foreach(null as $v)在 PHP 8.0+ 会报TypeError: foreach() argument must be of type array|object)。
真正触发 TypeError 的典型场景
-
你在自定义函数中加了类型声明,又把 array_merge 的结果直接当数组用
function processConfig(array $config): void { foreach ($config as $k => $v) { /* ... */ } } $result = array_merge($a, null); // Warning 发生,$result === null processConfig($result); // ❌ TypeError: Argument 1 passed to processConfig() must be of type array -
使用了 PHP 8.0+ 的联合类型或可为空声明,但逻辑没兜底
function mergeSafe(?array $a, ?array $b): array { return array_merge($a ?? [], $b ?? []); // ✅ 正确兜底 } // 若漏掉 ?? [],直接 array_merge($a, $b) 就可能传入 null -
在严格模式下(declare(strict_types=1))调用带类型提示的封装函数
PHP 8.5.12下载修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
declare(strict_types=1); function myMerge(array ...$arrays): array { return array_merge(...$arrays); // 这里 $arrays 是 array 类型,但若调用方传了 null,会在进入函数前就报错 } myMerge(null, ['x' => 1]); // ❌ TypeError: Argument #1 ($arrays) must be of type array, null given
如何避免这类问题
-
合并前主动过滤或转换:
$arr1 = $arr1 ?? []; $arr2 = is_array($arr2) ? $arr2 : []; $merged = array_merge($arr1, $arr2);
-
使用
array_filter($inputs, 'is_array')配合展开:$merged = array_merge(...array_filter([$a, $b, $c], 'is_array'));
-
不依赖运行时警告,改用更安全的替代方案:
- 需保留键名?用
$a + $b - 需递归合并?用
array_merge_recursive() - 需顶层覆盖不重排?用
array_replace()
- 需保留键名?用
PHP 8.0 没改变 array_merge() 的参数校验机制,它始终只发 Warning。所谓“报 TypeError”,本质是你的代码在 array_merge() 出错后,把 null 当作了数组继续操作,或在类型声明严格的上下文中提前拦截了非法参数。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










