+运算符是数组联合操作,左侧键优先:同键时保留左值、忽略右值;数字键不重索引,重复键被跳过;要求操作数均为数组,不兼容null。

PHP中+运算符的键优先级规则
+不是“加法”,而是数组联合(union)操作,它的设计目标就是保留左侧数组的完整性。当左右两个数组存在相同键名时,+直接忽略右侧对应键的值,不触发任何覆盖或合并逻辑——它本质上是“左侧主导”的浅层键去重追加。
+和array_merge()对重复字符串键的处理差异
这是最容易踩坑的地方:两者行为完全相反。
-
array_merge($a, $b):遇到相同字符串键,$b的值覆盖$a的值 -
$a + $b:遇到相同字符串键,$a的值保留,$b的值被丢弃 - 示例:
$a = ['name' => 'Alice']; $b = ['name' => 'Bob'];→$a + $b结果仍是['name' => 'Alice'],而array_merge($a, $b)得到['name' => 'Bob']
数字键在+运算中为什么像“被删除”了一样
因为索引数组的数字键(如0、1)会被当作普通键名参与联合判断。如果$a已有键0,$b[0]就永远进不去结果。
$a = ['x', 'y']; // 键为 0, 1$b = ['p', 'q']; // 键也为 0, 1-
$a + $b→['x', 'y'],$b的全部元素都被跳过 - 这不是bug,是规范行为;想拼接索引数组,请用
array_merge()或array_values(array_merge(...))
??=和+都适合默认值场景,但分工不同
??=解决的是“变量未定义或为null时赋默认值”,而+解决的是“数组配置项左优先兜底”。它们常一起出现,但不能互相替代。
立即学习“PHP免费学习笔记(深入)”;
-
$config ??= [];确保$config至少是个空数组 -
$config = $user_input + $defaults;让用户只覆盖想改的项,其余全走默认 - 注意:
+对null会报Warning: A non-numeric value encountered,必须确保两边都是数组;??=则天然兼容null
+根本不会动已存在的键——哪怕那个键的值是''、0或false,它也照留不误。



















