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
- 上一篇:PHP数组转查询字符串怎么写
- 下一篇:最后一页
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)
