PHP 8.1三元运算符真值判断逻辑与PHP 7一致,falsy值包括false、null、0、0.0、''、'0'和[],其余均为truthy;'0'是特例,而' 0 '或'0.0'为truthy。

PHP 8.1 中三元运算符的真值判断逻辑与 PHP 7 及更早版本完全一致,没有新增或修改 falsy 值列表。它的判断依据仍是 PHP 的“松散真值性”(truthiness),即条件表达式会自动转换为布尔值来决定走 ? 分支还是 : 分支。
三元运算符的真值判定规则(PHP 8.1 有效)
以下值在作为三元运算符的条件时,被判定为假(falsy),从而返回冒号 : 后的值:
falsenull- 整数
0 - 浮点数
0.0 - 空字符串
'' - 字符串
'0'(这是特例,注意不是所有数字字符串都为假) - 空数组
[]
除此之外,几乎所有其他值都被视为真(truthy),包括:
- 非空字符串(如
'00'、'false'、' '、'null') - 非零数字(如
-1、0.1、1e5) - 非空数组(如
[0]、['']、[null]) - 对象(即使属性为空)
- 资源(resource)、闭包(Closure)
⚠️ 关键提醒:
'0'是 falsy,但' 0 '(带空格)或'0.0'是 truthy —— 因为它们是非空字符串,不参与特殊转换。立即学习“PHP免费学习笔记(深入)”;
实际写法示例(PHP 8.1)
$input = '0'; $result = $input ? 'yes' : 'no'; // 输出 'no' $input = 0; $result = $input ? 'yes' : 'no'; // 输出 'no' $input = '00'; $result = $input ? 'yes' : 'no'; // 输出 'yes' $input = []; $result = $input ? 'yes' : 'no'; // 输出 'no' $input = [0]; $result = $input ? 'yes' : 'no'; // 输出 'yes'
安全建议:避免真值陷阱
由于 '0'、0、''、null 全部判为假,仅靠 ? : 很难区分它们。常见风险场景:
- 表单提交了字符串
'0'(如开关状态),却被当成“未填写” - 数组键存在但值为
'0',用$arr['status'] ?: 'pending'误设默认值
✅ 推荐替代方案:
-
判断变量是否已定义且非空 → 用
??(空合并运算符):$role = $_GET['role'] ?? 'guest'; // 不管是 null、未定义,还是 '',都 fallback
-
区分
'0'和''/null→ 显式比较:$value = ($input !== '' && $input !== null) ? $input : 'default';
-
检查数组键是否存在且非空 → 结合
isset()或array_key_exists():$name = isset($user['name']) && $user['name'] !== '' ? $user['name'] : 'Anonymous';
短三元写法(?:)在 PHP 8.1 中仍可用
$value = $input ?: 'fallback'; // 等价于 $input ? $input : 'fallback'
但它依然依赖真值判断,所以 $input = '0' 时也会触发 fallback —— 这不是 bug,是设计行为。
不复杂但容易忽略。



















