PHP 8.1+ 中 array_merge() 不接受 null,需用 ?? [] 安全合并;ThinkPHP 6.x 早期版本易因未判空报错,推荐封装 safe_merge() 函数并配合静态分析预防。

PHP 8.1 起,array_merge() 不再接受 null 值,传入会直接抛出 TypeError: array_merge(): Argument #1 must be of type array, null given。PHP 8.2 沿用该严格行为,尤其在 ThinkPHP 6.x 早期版本(如 v6.0.13 之前)中高频出现——比如拼接 where 条件、处理未初始化的请求参数或关联预载入配置时,变量可能为 null 却未经判断就进了 array_merge。
明确判空并提供默认数组
所有可能为 null 的参数,在传给 array_merge 前必须转换为数组。最简洁安全的方式是使用空合并运算符 ?? []:
array_merge($a ?? [], $b ?? [])array_merge($config['filters'] ?? [], $userInput ?? [])- 避免写
array_merge((array)$a, (array)$b)—— 强转对null会生成空数组,但对对象会触发弃用警告(Passing an object as array is deprecated)
检查常见易错位置
这些地方最容易漏掉判空,升级到 PHP 8.2 后首当其冲报错:
- ThinkPHP 的
where()方法中,动态构建条件数组(如where(array_merge($base, $extra))),$extra来自未设置的 POST 字段时为null - 模型的
scope方法里合并查询条件 - 使用
Db::table()->with(['relation' => function ($q) { ... }])时,闭包内调用array_merge处理可选参数 - Kimi 等 API 分片解析后用
array_merge()拼接响应结果(如并发请求返回部分为null)
统一封装安全合并函数
项目中高频使用时,可定义一个健壮的辅助函数,避免重复写 ?? []:
立即学习“PHP免费学习笔记(深入)”;
-
推荐写法:
function safe_merge(...$arrays) { return array_merge(...array_map(fn($a) => $a ?? [], $arrays)); } - 调用:
safe_merge($a, $b, $c),自动处理任意数量的null或数组参数 - 不建议用
is_array()手动判断——代码冗长,且无法覆盖null和false等边界值
配合 IDE 和静态分析提前拦截
利用 PHPStan 或 Psalm 配置规则,检测 array_merge 直接接收可能为 null 的变量:
- 在
phpstan.neon中启用checkNullables和checkExplicitMixed - 给函数参数加类型提示,如
function handleConfig(array $options = []),而非mixed - ThinkPHP 升级至 v6.0.13+ 可减少此类问题,因其内部已对多数
array_merge调用做了判空处理



















