?? 更适合默认值场景,它仅在变量为 null 或未定义时使用默认值,不误吞 0、false、'' 等合法假值;?: 是三元简写,会因 empty() 判定误触发默认值并可能报 Notice;??= 提供安全的默认赋值。

?? 更适合默认值场景,前提是「你只关心变量是否为 null 或未定义」;?: 本质是条件判断,不是默认值工具,强行用于默认值容易覆盖合法的“假值”。
?? 是专为默认值设计的空合并运算符
?? 的行为等价于 isset($var) ? $var : $default,它只在左侧为 null 或未声明时才取右侧值。
- 不会把
0、false、''(空字符串)当作“需要替换”的情况 - 对未定义变量(如
$config['timeout']中键不存在)完全静默,不报Notice - 适合配置项、API 响应字段、表单输入等「缺失即用默认」的语义
例如:
$timeout = $config['timeout'] ?? 30; // $config['timeout'] 为 0 → 返回 0;为 null 或不存在 → 返回 30
?: 实际是 empty() 简写,会误吞合法值
?: 是三元运算符的简写形式:$var ?: $default 等价于 $var ? $var : $default,而 PHP 中 $var 在布尔上下文中会被 empty() 判定。
立即学习“PHP免费学习笔记(深入)”;
-
0、0.0、false、''、[]、null全部触发默认值 - 若变量未定义,还会抛出
Notice: Undefined variable
例如:
$timeout = $config['timeout'] ?: 30; // $config['timeout'] = 0 → 返回 30(错误!本意是接受 0)
??= 是更安全的默认值赋值方式
当你要“仅在没值时设默认值”,直接改用 ??=:
-
$config['debug'] ??= false;:仅当$config['debug']为null或未定义时才赋值 - 不影响已设为
0、false、''的有效配置 - 替代了过去常见的
if (!isset($x)) $x = 'default';冗余写法
注意:??= 要求 PHP ≥ 7.4,且左侧必须是可写变量(不能是函数调用或表达式)。
真正容易被忽略的是:默认值逻辑不是“非真即假”,而是“是否存在”。用 ?: 处理默认值,等于默认把 0 当作“配置未设置”,这在 timeout、limit、score、status code 等数值型字段中极易引发线上问题。



















