php 7引入的`??`是空合并运算符,用于安全获取变量值:当左侧操作数存在且不为`null`时返回其值,否则返回右侧默认值,比`isset()`+三元组合更简洁高效。
在PHP开发中,频繁需要处理未定义或为null的变量(如$_GET、$_POST参数或配置项),传统写法往往冗长且易出错。例如,为避免Notice: Undefined variable,开发者常这样判断:
$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';
✅ 核心规则:$a ?? $b 等价于 isset($a) && $a !== null ? $a : $b
⚠️ 注意:它不等价于 empty()(empty()会将 0、'0'、false、[] 等 falsy 值判定为“空”,而 ?? 仅关注 null 和“未定义”);也不等价于单纯 isset()(isset()不检查值是否为null,但??会——若变量存在但值为null,仍会回退到右侧表达式)。
此外,?? 支持链式使用,可逐级提供默认值:
$country = $_SESSION['user']['profile']['country'] ?? $_COOKIE['default_country'] ?? 'US';
这比嵌套三元运算符(?:)或多重isset()判断更可读、更安全。
? 重要提示:
$config['timeout'] ??= 30; // 等价于 if (!isset($config['timeout'])) $config['timeout'] = 30;
总之,?? 是现代PHP中处理可选值的首选工具——它精准聚焦于“存在性 + 非空性(非null)”双重校验,兼顾性能、安全与可维护性。