??=是空合并赋值运算符,仅在左侧变量未定义或为null时才赋值,否则保持原值;它不判断假值(如0、''、false),且为就地赋值语句,等价于if(!isset($a)){$a=$b;}。

空合并赋值运算符 ??= 是什么
它只在左侧变量未定义或为 null 时,才把右侧值赋给它;否则保持原值不变。不是“判空”,而是“判 null 或未定义”——这点和 ?? 一致,但 ??= 是就地赋值,不重复写变量名。
??= 和 ??、?: 的关键区别
很多人误以为 ??= 是 ?: 的语法糖,其实不是:
-
$a ??= $b等价于if (!isset($a)) { $a = $b; }(注意:不触发empty()判定) -
$a ?: $b会把0、''、false都当成“假值”去执行赋值,而??=不会 -
$a ?? $b是表达式,返回值;$a ??= $b是语句,修改$a本身
实际用法与常见踩坑
典型场景是初始化配置、缓存、请求参数默认值。容易出错的地方集中在变量作用域和引用行为上:
- 不能对函数返回值或数组元素直接使用:
get_config() ??= 'default'会报Fatal error: Uncaught Error: Cannot assign to function call - 数组键存在但值为
null时生效:$arr['user'] ??= 'guest'—— 若$arr['user']是null,会被覆盖;若键不存在,也会被创建并赋值 - 对象属性同理:
$obj->name ??= 'anonymous'可行,但若$obj为null,会触发Notice: Trying to access array offset on null - 和
??一样,右侧支持链式调用:$config['timeout'] ??= $defaults['timeout'] ?? 30;
PHP 7.4+ 兼容性与替代写法
??= 是 PHP 7.4 新增的,低版本必须用 isset() 显式判断:
// PHP 7.4+
$cache[$key] ??= compute_value($key);
// PHP 7.3 及以下等效写法
if (!isset($cache[$key])) {
$cache[$key] = compute_value($key);
}
注意:不要用 empty() 替代 isset(),因为 empty('0') 为 true,但 ??= 不会覆盖字符串 '0'。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











