php
7引入的`??`是空合并运算符,用于安全获取变量值:当左侧操作数存在且不为`null`时返回其值,否则返回右侧默认值,比`isset()`+三元组合更简洁高效。
在PHP开发中,频繁需要处理未定义或为null的变量(如$_GET、$_POST参数或配置项),传统写法往往冗长且易出错。例如,为避免Notice: Undefined variable,开发者常这样判断:
而空合并运算符 ?? 提供了语义清晰、语法简练的替代方案:
✅
核心规则
:$a ?? $b 等价于 isset($a) && $a !== null ? $a : $b
⚠️ 注意:它
不等价于 empty()
(empty()会将 0、'0'、false、[] 等 falsy 值判定为“空”,而 ?? 仅关注 null 和“未定义”);也
不等价于单纯 isset()
(isset()不检查值是否为null,但??会——若变量存在但值为null,仍会回退到右侧表达式)。
此外,?? 支持链式使用,可逐级提供默认值:
这比嵌套三元运算符(?:)或多重isset()判断更可读、更安全。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
立即学习
“
PHP免费学习笔记(深入)
”;
?
重要提示
:
?? 是
短路运算符
:若左侧表达式已满足条件,右侧表达式
不会被求值
(适合含函数调用的默认值,如 getFallbackName() ?? 'guest');
自 PHP 7.4 起支持
空合并赋值运算符 ??=
,语法更进一步简化:
总之,?? 是现代PHP中处理可选值的首选工具——它精准聚焦于“存在性 + 非空性(非null)”双重校验,兼顾性能、安全与可维护性。
$username = isset($username) && $username !== null ? $username : '';
// 或更谨慎地:
$username = !empty($username) ? $username : ''; // ❌ 错误:empty()会把'0'、'false'等falsy值也判为“空”$username = $username ?? '';
$user_id = $_GET['id'] ?? 0;
$theme = $config['theme'] ?? 'light';$country = $_SESSION['user']['profile']['country'] ?? $_COOKIE['default_country'] ?? 'US';$config['timeout'] ??= 30; // 等价于 if (!isset($config['timeout'])) $config['timeout'] = 30;