所有php版本(7.0+)中array_merge传入null均触发警告并返回null,因null非法;安全写法为(array)$arr、$arr ?? []或is_array校验后调用。

PHP 8.0 中 array_merge 传入 null 会直接触发警告并返回 null,而低版本(如 PHP 7.4)行为一致但错误提示略有差异——关键不是“版本差异”,而是所有带类型校验的 PHP 版本(7.0+)都严格要求参数为数组,null 始终非法。
所有版本共性:null 不是数组,必须拦截
无论 PHP 7.2、7.4 还是 8.0+,只要调用 array_merge(null, ['a' => 1]),都会:
- 发出 Warning:Expected parameter 1 to be an array, null given
- 函数返回
null(不是空数组!) - 若开启
strict_types=1或使用静态分析工具,还会提前报错
PHP 8.0+ 的额外风险:严格模式更敏感
PHP 8.0 默认启用更多运行时类型检查,尤其在以下场景暴露更快:
- 配合
??=或??使用时,比如$config = $config ?? []没做,直接array_merge($config, $defaults) - 函数参数声明了
array类型,但传入null会先卡在类型声明层,不进到array_merge -
gettype(null)在 8.0+ 返回小写"null",若你曾用字符串判断绕过(如if (gettype($x) !== 'array')),逻辑可能漏掉null
安全兼容写法:三步兜底
不依赖版本,统一用以下方式处理可能为 null 的变量:
-
显式转换:
array_merge((array)$arr1, (array)$arr2)—— 强转对null、false、0都生成空数组,无警告 -
空合并兜底:
array_merge($arr1 ?? [], $arr2 ?? [])—— PHP 7.0+ 支持,语义清晰 -
类型校验后调用:
is_array($arr1) ? array_merge($arr1, $arr2) : array_merge([], $arr2)—— 最严谨,适合关键路径
避免踩坑的两个习惯
很多问题其实源于开发习惯,而非版本升级:
- 别让数组变量处于“未初始化”状态:定义时就设默认值,如
$data = $input['items'] ?? []; - 别混用
array_merge和+:前者重索引+覆盖键,后者保留左键+不覆盖;null + []会报致命错误,而array_merge(null, [])至少只警告
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











