
PHP null合并运算符 ?? 是什么
它不是“三元运算符的简写”,也不是“isset() 的替代品”——它是专门用来处理“变量存在但为 null”这种中间态的短路操作符。只要左边操作数不为 null(注意:0、''、false 都算有效值),就直接返回它;否则返回右边的默认值。
?? 和 ?: 的区别在哪
很多人用错,是因为把 ?? 当成 ?: 的“更安全版本”,其实它们解决的是不同问题:
-
$a ?: $b:左边为“falsy”(false、0、''、null、[]等)就取右边 -
$a ?? $b:只在左边是null或**未定义**时才取右边,0、false、''都照常返回
比如:$count = $_GET['limit'] ?? 10; —— 用户传 ?limit=0 时,$count 就是 0,不是 10;换成 ?: 就会意外覆盖成 10。
嵌套使用 ?? 时要注意顺序和括号
它从左到右短路,但没括号容易误读优先级。尤其和数组访问、函数调用混用时:
立即学习“PHP免费学习笔记(深入)”;
-
$user->profile->age ?? 18:如果$user为null,会报Trying to get property 'profile' of non-object - 正确写法是:
($user->profile->age ?? null) ?? 18,或更稳妥:$user?->profile?->age ?? 18(PHP 8.0+ 空安全操作符) - 链式调用中,
??不会阻止前面的致命错误,它只管“当前表达式是否为null”
兼容性与常见踩坑点
?? 是 PHP 7.0 引入的,低于这个版本会直接 Parse error。另外几个高频翻车场景:
- 在
foreach键名中误用:foreach ($data as $key => $value) { echo $key ?? 'unknown'; }——$key永远不会是null,这里毫无意义 - 和
empty()混淆:empty($x)判的是“空值”,而$x ?? $y只关心是否null或未定义 - 用在对象属性赋值时忘了引用语义:
$obj->name = $input['name'] ?? 'guest';没问题;但若$input本身未定义,就会 Warning:Undefined variable: input
真正要防的,不是 null,而是变量压根没声明 —— ?? 对未定义变量是安全的,但对未定义数组、未定义对象属性,得靠 ?-> 或先判 isset()。










