?: 是 php 5.3+ 的三元简写,左侧为真值时返回其本身,否则返回右侧值;它基于 truthy/falsy 判断,会错误过滤 0、''、false 等合法假值,适用场景是不关心这些值是否被覆盖,需保假值时应使用 ??。

?: 是 PHP 5.3+ 引入的三元简写形式,但它**不是省略中间值的“语法糖”**,而是有明确语义的独立结构:当左侧表达式为真值(truthy)时,直接返回它本身;否则返回右侧值。很多人误以为它只是 ? : 的缩写,结果在 0、''、false 场景下得到意外结果。
什么时候用 ?: 而不是 ? :
核心判断点是:你是否想“原样保留左侧值(只要它为真值)”,而不是根据某个条件返回两个预设值。
- 适合场景:取请求参数、配置项、函数返回值,并 fallback 到默认值 —— 且你**不关心
0、'0'、false这类假值是否被覆盖** - 典型误用:
$id = $_GET['id'] ?: 1;—— 若 URL 带?id=0,$id会变成1,而非0 - 正确替代(需保
0):$id = $_GET['id'] ?? 1;(只在null或未定义时 fallback) - 若需完整条件判断(如
$x > 10),必须用完整? :,?:不支持
?: 的求值逻辑和常见陷阱
PHP 对左侧表达式执行“宽松真假判断”(即转换为布尔后为 true 才返回它),这个过程会把 0、0.0、''、[]、null、false 全部当作 false 分支处理。
- 示例:
$name = '' ?: 'guest';→ 返回'guest'(空字符串是 falsy) - 示例:
$count = 0 ?: 10;→ 返回10(数字 0 是 falsy) - 示例:
$data = ['id' => 0]; $id = $data['id'] ?: 999;→$id是999,不是0 - 注意:它不检查键是否存在 ——
$data['missing'] ?: 'n/a'会触发Notice: Undefined index
和 ??、??= 的关键区别
三者用途不同,混用会导致逻辑错误:
-
?::基于 truthy/falsy 判断,左侧为 falsy 就取右边 —— 副作用是可能掩盖合法假值 -
??:仅检测null或未定义(isset()语义),0、''都算有效值 -
??=:赋值版??,只在左侧为null/未定义时才赋值,避免重复计算或覆盖已有值 - 链式 fallback:
$val = $a ?: $b ?: $c;和$val = $a ?? $b ?? $c;行为完全不同 —— 前者遇到第一个 falsy 就跳,后者只跳过null/undefined
最易被忽略的是:没有“万能默认值操作符”。选 ?: 还是 ??,本质是在回答“你到底想过滤掉哪些值?”—— 如果业务上 0 是有效状态(比如库存为 0),就绝不能用 ?:。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











