php 8.0三元运算符假值规则与php 7.x一致,共7类:false、0、0.0、""、"0"、null、[];短三元?:依此规则,??则仅判null/未定义,更安全。

PHP 8.0 中三元运算符对“假值”(falsy values)的处理逻辑与 PHP 7.x 一致,没有新增或修改真值判断规则。它仍严格遵循 PHP 的松散类型真值转换机制:只要条件表达式的结果属于预定义的 7 类假值,整个条件即被判定为 false,从而返回冒号(:)后的值。
哪些值会被当作假值?
在 PHP 8.0 中,以下值在三元运算符条件中会被视为 false:
-
布尔值
false -
整数
0 -
浮点数
0.0 -
空字符串
"" - 字符串 "0"(唯一特例:非空但被认定为 falsy)
- null
-
空数组
[]
注意:"00"、"0.0"、"false"、" "(含空格)等非空字符串,全部视为 true;未定义变量参与判断会触发 Notice 警告,且条件结果为 false。
?: 短三元写法的假值行为
PHP 5.3 引入的短三元语法 $x ?: $default 在 PHP 8.0 中依然等价于 $x ? $x : $default,完全依赖上述假值规则:
-
$a = 0; echo $a ?: 'n/a';→ 输出'n/a' -
$a = "0"; echo $a ?: 'n/a';→ 输出'n/a'(因"0"是 falsy) -
$a = "00"; echo $a ?: 'n/a';→ 输出"00"(非空字符串 → truthy)
?? 空合并运算符 vs ?: —— 关键区别
PHP 7.0+ 的 ?? 运算符不关心真假,只检测 是否为 null 或未定义,因此对假值更“宽容”:
-
$a = ""; echo $a ?: 'default';→'default'(""是 falsy) -
$a = ""; echo $a ?? 'default';→""(""不是 null/undefined) -
$a = 0; echo $a ?? 'default';→0 -
echo $b ?? 'default';($b未定义)→'default'
安全实践建议
当业务逻辑需区分 0、""、false 等不同语义时,避免直接依赖三元运算符的隐式真假判断:
- 用
isset($var)判断变量是否存在且不为 null - 用
!empty($var)判断非空且非零(但注意empty("0") === true) - 需精确匹配时,改用严格比较:
$var === ''、$var === 0、$var === false - 默认值场景优先选
??;仅需真假分流时再用?:
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











