
php 7 引入的 `??` 是空合并运算符,用于安全获取变量值:当左侧操作数存在且不为 `null` 时返回其值,否则返回右侧默认值,兼具 `isset()` 和空值判断逻辑,比嵌套三元运算更简洁高效。
在 PHP 开发中,经常需要为可能未定义或为 null 的变量提供默认值。传统方式常依赖 isset() 或 empty() 配合三元运算符,例如:
$username = isset($_GET['username']) ? $_GET['username'] : 'guest'; // 或更冗长的写法: $username = !empty($_GET['username']) ? $_GET['username'] : 'guest';
这类写法不仅重复访问数组键(存在潜在性能开销和 Notice 风险),还易出错——比如 empty() 会将 0、'0'、false 等“falsy 值”误判为需兜底,而实际业务中这些值可能是合法输入。
PHP 7 起引入的 空合并运算符(Null Coalescing Operator) ?? 正是为此优化而生。它的语义非常明确:
✅ 检查左侧表达式是否已声明且不为 null(等价于 isset($var) && $var !== null);
❌ 若不满足,则直接返回右侧表达式结果,不执行左侧表达式二次求值(安全、高效、无 Notice)。
语法形式为:
$result = $expr1 ?? $expr2;
等价于:
PHP网络编程技术详解由浅入深,全面、系统地介绍了PHP开发技术,并提供了大量实例,供读者实战演练。另外,笔者专门为本书录制了相应的配套教学视频,以帮助读者更好地学习本书内容。这些视频和书中的实例源代码一起收录于配书光盘中。本书共分4篇。第1篇是PHP准备篇,介绍了PHP的优势、开发环境及安装;第2篇是PHP基础篇,介绍了PHP中的常量与变量、运算符与表达式、流程控制以及函数;第3篇是进阶篇,介绍
立即学习“PHP免费学习笔记(深入)”;
$result = isset($expr1) && $expr1 !== null ? $expr1 : $expr2;
实用示例
// 从 $_GET 安全取值,避免未定义索引警告 $user = $_GET['user'] ?? 'anonymous'; // 若 $_GET['user'] 不存在或为 null,返回 'anonymous' // 链式调用(PHP 7.4+ 支持多级空合并) $avatar = $_SESSION['user']['profile']['avatar'] ?? $_ENV['DEFAULT_AVATAR'] ?? '/img/default.png'; // 变量自身兜底(常用于函数参数初始化) $limit = $limit ?? 10;
⚠️ 注意事项
- ?? 不等价于 empty():empty('0') 返回 true,但 '0' ?? 'default' 仍返回 '0'(因字符串 '0' 不为 null 且已定义);
- ?? 短路求值:若 $expr1 为 null 或未定义,$expr2 才会被执行,适合含函数调用的默认值(如 get_default_config() ?? []);
- 不支持在 ?? 左侧使用纯字面量(如 null ?? 'a' 合法,但 'hello' ?? 'world' 虽语法允许,却无实际意义);
- 与三元运算符可组合使用,但需注意优先级:?? 优先级低于 ?:,建议用括号明确逻辑,例如 ($a ?? 0) ?: $b。
总结
?? 是 PHP 7 标志性语法糖之一,以极简写法替代了高频的 isset() 判断场景,在可读性、安全性与性能上均优于传统方案。推荐在所有需要“存在性 + 非空”默认值赋值的场景中优先使用它,同时牢记其与 empty() 的本质区别,避免语义误用。










