Menu

PHP 三元运算符:?: 简写与嵌套三元

PHP 三元运算符就是一行写完的 if/else:$result = $condition ? 'yes' : 'no';。学习短三元 ?:(Elvis 运算符)、它和 ?? 的区别、为什么从 PHP 8 开始嵌套三元必须加括号,以及什么时候用 match 更清楚。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

三元运算符是一个能塞进一个表达式里的 if/else:condition ? valueIfTrue : valueIfFalse。它返回两个值中的一个,所以你可以把它赋值给变量、用 echo 输出,或者传给函数。

把 $age 改成 15,把 $items 改成 3,再运行一次。注意最后一行三元表达式外面的括号:没有括号的话,. 会先拼接字符串,结果就不是你想要的了。

在 HTML 模板中使用三元运算符

在模板里选择 CSS 类、标签文字或属性时,通常就用三元运算符。下面的代码会从 URL 读取 ?stock=:运行它,然后点击“页面”标签页里的链接,同一个脚本会用不同的值再运行一次。

<?= ... ?> 是 <?php echo ... ?> 的简写,能让标记里的单行条件保持易读。

短三元 ?:(Elvis 运算符)

省略中间部分就得到 $a ?: $b:$a 为真值时返回 $a,否则返回 $b。如果空字符串或 0 也应该使用默认值,用它来设置默认值很方便。

假值包括 false、0、0.0、""、"0"、[] 和 null。如果 "0" 在你的数据里是一个真实的答案(数量字段、PIN 码),短三元会把它丢掉。

?: 和 ?? 的区别

它们看起来很像,但检查的东西不同。?: 在左边为假值时使用默认值。?? 只在左边为 null 或未设置时才使用默认值,而且变量或数组键不存在时不会发出警告。

“这个值可能不存在”时用 ??(请求数据、配置数组、可选的键)。“这个值存在但可能为空”时用 ?:。空合并运算符页面详细介绍了 ?? 和 ??=。

嵌套三元必须加括号

PHP 7 会从左到右解析 a ? b : c ? d : e,这和几乎所有其他语言都不一样,而且会得出错误的结果。PHP 8 拒绝猜测:

<?php
echo $score > 90 ? "A" : $score > 80 ? "B" : "C";
PHP Fatal error:  Unparenthesized `a ? b : c ? d : e` is not supported. Use either `(a ? b : c) ? d : e` or `a ? b : (c ? d : e)` in /home/index.php on line 2

给内层的三元表达式加上括号就能正常运行:

短三元是个例外:$a ?: $b ?: $c 不加括号也可以,就像上面 Elvis 的例子那样。

分支超过两个时用 match(true)

三四层的嵌套三元,即使加了括号也很难读。以 true 为匹配对象的 match 会从上到下检查条件,返回第一个匹配的分支:

两个结果、一行写完时用三元运算符;一旦需要第三个分支,就改用 match 或 if/elseif 链。

常见问题

PHP 中的三元运算符是什么?

它是 if/else 的简写形式,会返回一个值:$label = $age >= 18 ? 'adult' : 'minor';。如果 ? 前面的条件为真,就使用 ? 后面的表达式,否则使用 : 后面的表达式。

PHP 中 ?: 是什么意思?

$a ?: $b 是短三元(也叫 Elvis 运算符)。如果 $a 为真值就返回 $a,否则返回 $b,所以 '' ?: 'default' 的结果是 'default'。它和 $a ? $a : $b 相同,但 $a 只计算一次。

PHP 中可以嵌套三元运算符吗?

只能加括号。从 PHP 8 开始,$a ? 'x' : $b ? 'y' : 'z' 是致命错误,所以要写成 $a ? 'x' : ($b ? 'y' : 'z')。分支超过两个时,match(true) 或 if/elseif 链更好读。

三元运算符可以省略 else 部分吗?

不可以,三元运算符始终需要两个分支。要表达“用这个值,否则用默认值”,写 $x ?: 'default' 或 $x ?? 'default';只想在条件成立时做某件事,写普通的 if,或者 $condition && doSomething();。

Coddy 编程语言插图

和 Coddy 一起学编程

开始