PHP 7.0 的空合并运算符 ?? 专用于安全读取未定义或 null 的变量,仅判断“是否存在且非 null”,不处理 false、0、'' 等假值;支持链式兜底和 ??= 赋默认值,与字符串拼接时需加括号。

PHP 7.0 引入的空合并运算符 ?? 是专为安全读取可能未定义或为 null 的变量而设计的,它不处理 false、0、空字符串 '' 等“假值”,只关注“是否存在且非 null”这一明确条件。
基础用法:替代 isset() + 三元判断
传统写法冗长且易错:
$name = isset($_GET['name']) ? $_GET['name'] : 'guest';-
$id = !empty($_POST['id']) ? $_POST['id'] : 1;(⚠️ 错误:会把合法的'0'或0当成空)
用 ?? 一行解决,语义清晰、无警告:
-
$name = $_GET['name'] ?? 'guest';—— 若$_GET['name']未提交或为null,取默认值 -
$id = $_POST['id'] ?? 1;——0、'0'、false都原样保留
链式使用:安全访问嵌套数组或配置
深层键访问极易触发 Notice: Undefined index,?? 可逐级兜底:
立即学习“PHP免费学习笔记(深入)”;
$country = $_SESSION['user']['profile']['country'] ?? $_COOKIE['country'] ?? 'CN';-
$host = $config['database']['host'] ?? 'localhost';—— 即使$config['database']不存在也不报错
注意:它从左到右检查,返回第一个存在且不为 null 的值。
与字符串拼接配合时必须加括号
因为点号 . 的优先级高于 ??,不加括号会导致逻辑错误:
- ❌ 错误:
"User: " . $username ?? 'anonymous'→ 实际等价于("User: " . $username) ?? 'anonymous',若$username为null,结果是"User: "(PHP 将null转为空串),永远不触发默认值 - ✅ 正确:
"User: " . ($username ?? 'anonymous')
搭配 ??= 设置默认值(PHP 7.4+)
如果只需在变量未定义或为 null 时赋一次默认值,用 ??= 更简洁:
-
$config['timeout'] ??= 30;→ 等价于if (!isset($config['timeout']) || $config['timeout'] === null) $config['timeout'] = 30; -
$_SESSION['cart_id'] ??= uniqid('cart_');—— 仅首次初始化,后续不覆盖
注意:??= 不会影响已有有效值(包括 0、false、'')。



















