php null合并运算符怎么用_php null合并??运算符【默认】

2次阅读

php null合并运算符怎么用_php null合并??运算符【默认】

php NULL合并运算符 ?? 是什么

它不是“三元运算符的简写”,也不是“isset() 的替代品”——它是专门用来处理“变量存在但为 null”这种中间态的短路操作符。只要左边操作数不为 null(注意:0''false 都算有效值),就直接返回它;否则返回右边的默认值。

???: 的区别在哪

很多人用错,是因为把 ?? 当成 ?: 的“更安全版本”,其实它们解决的是不同问题:

  • $a ?: $b:左边为“falsy”(false0''null[] 等)就取右边
  • $a ?? $b:只在左边是 null 或**未定义**时才取右边,0false'' 都照常返回

比如:$count = $_GET['limit'] ?? 10; —— 用户传 ?limit=0 时,$count 就是 0,不是 10;换成 ?: 就会意外覆盖成 10

嵌套使用 ?? 时要注意顺序和括号

它从左到右短路,但没括号容易误读优先级。尤其和数组访问、函数调用混用时:

立即学习PHP免费学习笔记(深入)”;

  • $user->profile->age ?? 18:如果 $usernull,会报 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()

text=ZqhQzanResources