当前位置:首页 > PHP教程 > php数组 > 列表

PHP8.2 数组合并遇到 null 变量,直接使用 array_merge 传入 null 报错修复

发布:smiling 来源: PHP粉丝网  添加日期:2026-10-23 12:36:47 浏览: 评论:0 

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)

统一封装安全合并函数

项目中高频使用时,可定义一个健壮的辅助函数,避免重复写 ?? []:

推荐写法: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 调用做了判空处理。

Tags: PHP8.2数组合并 null变量 array_merge

分享到: