PHP 7.4 的 ??= 运算符用于变量为 null 时赋值,可简化配置数组默认值设置、对象属性懒初始化及函数内参数兜底逻辑,仅在左侧为 null 时触发,不覆盖 0/false/'' 等合法值。

PHP 7.4 引入的 null 合并赋值运算符(??=),主要用来在变量为 null 时才进行赋值,它本身不直接用于函数参数定义,但能非常有效地简化函数内部对参数(尤其是可选参数或配置数组)的默认值处理逻辑。
下面从实际使用场景出发,说明如何用 ??= 简化常见参数判断:
函数中处理可变配置数组
当函数接收一个 $options 数组作为配置参数,且希望为其中某些键设置默认值时,传统写法常需 isset() 或三元判断:
$options['timeout'] = $options['timeout'] ?? 30; $options['retries'] = $options['retries'] ?? 3;
用 ??= 可直接缩写为:
立即学习“PHP免费学习笔记(深入)”;
$options['timeout'] ??= 30; $options['retries'] ??= 3;
这行代码含义明确:仅当 $options['timeout'] 为 null(注意:不是 false、0 或空字符串)时,才赋值 30;其他“falsy”值(如 0、''、false)会被保留,语义更精准。
处理对象属性的懒初始化
在方法中延迟初始化某个对象属性(比如缓存实例),避免重复创建:
public function getCache()
{
$this->cache ??= new Redis();
return $this->cache;
}相比 if ($this->cache === null) { $this->cache = new Redis(); },更简洁且线程安全(在单次请求内)。
结合函数参数解构与默认值组合使用
虽然 PHP 不支持在函数签名里直接用 ??=,但可在函数体内配合 func_get_args() 或解包数组参数使用:
function apiRequest($url, array $options = [])
{
$options['method'] ??= 'GET';
$options['headers'] ??= [];
$options['timeout'] ??= 10;
// 继续使用 $options...
}这样既保持了调用简洁性(无需每个参数都写默认值),又避免了 empty() 或 isset() 的冗余判断。
注意事项
-
??=只在左侧操作数为null时触发赋值,不会覆盖0、false、''等合法值; - 左侧必须是可写变量(如变量、数组元素、对象属性),不能是函数调用或表达式;
- 如果
$options本身未定义,$options['key'] ??= 'val'会触发Notice: Undefined variable,应先确保变量已声明(如$options = $options ?? [];)。
用好 ??=,能让参数兜底逻辑更轻量、意图更清晰,尤其适合配置合并、懒加载和状态初始化场景。



















