PHP 8.0中字符串"0"在?:中返回默认值(因falsy),在??中返回自身(因已定义且非null);需用??或显式判断区分"0"与其他falsy值。

PHP 8.0 中,三元运算符对字符串 "0" 的处理需特别注意:它在布尔上下文中被判定为 false,这与空字符串、null、false、整数 0 等同属“falsy”值。
字符串 "0" 在三元运算中会被当作 false
因为 PHP 的类型隐式转换规则,三元运算符(?:)和空合并运算符(??)的判断逻辑不同:
-
$a ?: $b判断$a是否为“空值”(falsy),"0"是 falsy → 返回$b -
$a ?? $b判断$a是否已定义且不为null,"0"是有效非-null 字符串 → 返回$a
常见误用与对比示例
以下代码在 PHP 8.0 中运行结果明确:
$str = "0"; var_dump($str ?: 'default'); // string(7) "default" (因 "0" == false) var_dump($str ?? 'default'); // string(1) "0" (因 $str 已定义且非 null) var_dump($str === '' ? 'empty' : 'not empty'); // "not empty"
安全处理字符串 "0" 的建议
若业务中需区分 "0" 和其他 falsy 值(如空字符串、null),避免直接用 ?::
立即学习“PHP免费学习笔记(深入)”;
- 用
??获取存在性默认值(推荐用于配置、参数兜底) - 显式判断:
is_string($str) && $str !== ''或strlen($str) > 0 - 需要数值语义时,先用
(string)$val统一类型再比较
关键记住:三元运算符的 ?: 看的是“真假值”,不是“是否为空字符串”;而 ?? 看的是“是否存在且非 null”。字符串 "0" 存在、非 null、但为 falsy —— 这个差异必须主动识别,不能依赖直觉。



















