PHP 8.3中三元运算符对falsy值的处理逻辑与PHP 7.0以来一致,仍判定false、0、0.0、""、"0"、null、[]及未定义变量为false;而??仅在null或未定义时返回默认值。

PHP 8.3 中三元运算符对“假值”(falsy values)的处理逻辑与 PHP 7.0 以来保持一致,**没有新增或修改 falsy 值列表**。它仍严格遵循 PHP 的松散类型真值判断规则:只要条件表达式的结果属于预定义的 falsy 类型,就执行冒号右侧分支。
PHP 8.3 中被判定为假的值有哪些
以下值在三元运算符的条件位置会被视为 false,从而返回 : value_if_false:
-
布尔值
false -
整数
0 -
浮点数
0.0 -
空字符串
"" - 字符串 "0"(这是特例,PHP 一贯将其视作 falsy)
- null
-
空数组
[] -
未定义变量(如
$undefined,会触发Notice,但条件判断仍为 false)
常见易错点:哪些看似“假”的值其实是 true
这些值虽然语义上像假,但在 PHP 8.3 中属于 truthy,三元运算符会走 value_if_true 分支:
-
"00"、"0.0"、"false"、"null"—— 非空字符串,一律为 true -
" "(含空格的字符串)—— 长度 > 0,为 true -
[0]、[""]—— 非空数组,为 true -
0.0001、-1、false === false(布尔表达式结果为 true)—— 均为 true
?: 和 ?? 在 PHP 8.3 中的关键区别
二者都常用于默认值赋值,但判断依据不同:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
-
$x ?: 'default':检查$x是否为 falsy(包括0、""、"0"等)→ 若是,返回'default' -
$x ?? 'default':仅检查$x是否 未定义或为 null → 若是,返回'default';否则原样返回$x(哪怕它是0或"")
例如:
$a = 0;<br>$b = '';<br>echo $a ?: 'n/a'; // 输出 'n/a'(因为 0 是 falsy)<br>echo $a ?? 'n/a'; // 输出 0(因为 $a 已定义且不为 null)<br>echo $b ?: 'n/a'; // 输出 'n/a'(因为 '' 是 falsy)<br>echo $b ?? 'n/a'; // 输出 ''(因为 $b 已定义)
安全建议:何时不该依赖三元的真假判断
当业务逻辑需要区分 0 和 null、或 "" 和 "0" 时,直接用三元容易出错:
- 用户输入金额为
0,不应被当成“未填写” - API 返回字段可能是
"0"(有效状态码),不能等同于缺失 - 数组键存在但值为
0,用$arr['key'] ?: 'missing'会误判
此时应改用显式判断:
// 更准确<br>$value = isset($input) && $input !== '' && $input !== '0' ? $input : 'default';<br>// 或用空合并 + 二次校验<br>$value = ($input ?? '') !== '' ? $input : 'default';
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










