PHP Manual

PHP中的三元运算符(?:) - 一行中的条件

26. 11. 2019

Obsah článku

三元运算符允许你将一个简单的条件缩短为一行,在一个没有必要、复杂或完全不合适的地方进行解析。

TL;DR

三元运算符是ifelse条件的缩写,所以你不需要使用它们。它们对不断重复的验证逻辑片段很有用。始终使用(条件?正逻辑:负逻辑)的格式,包括括号。用于简短的验证,使代码更加清晰和简短。

基本定义

通常情况下,我们有一个形式的条件,比如说。

$a = 5;
$b = 3;
if ($a > $b) {
echo '它更大';
} else {
echo '它更小';
}

因此,如果我们只想写一个简单的句子,我们必须使用4行代码,而这可以减少到1行。

$a = 5;
$b = 3;
echo '它是' . ($a > $b ? '较大的' : '较小的');

一般来说,三元运算符用3个部分来写(这就是它被称为 "三元 "的原因)。

(condition ? '是' : '从')

三元运算符在实践中非常常用,例如,表示表格中的偶数行。

$pole = [3, 1, 4, 1, 5, 9, 2];
for ($i = 0; $pole[$i]; $i++) {
echo '<tr class=""' . ($i % 2 ? '从' : '甚至') . '">';
// 这是某种程度上与电子表格的工作...
// 例如: echo '<td>' .$field[$i] . '</td>'。
echo '</tr>';
}

使用三元运算符的例子

很多时候,我们需要检查一个变量值的存在,并在必要时立即使用它。如果它不存在,我们要返回默认值。

经典的方法是这样做的。

$a = 5;
$b = 8;
$c = $a ? $a : $b;

如果变量$a存在,则使用$a作为值,否则使用$b

然而,有时我们会从一个函数中得到这个值。

$a = 5;
$b = 3;
$default = 42;
$c = my_function($a, $b) ? my_function($a, $b) : $default;

这种调用方法在系统资源方面是非常低效的。首先,必须调用该函数,如果该函数存在,则再次调用该函数以获得数值,该数值被存储在`$c'变量中。

这可以通过一个辅助变量更好地处理。

$a = 5;
$b = 3;
$helper = my_function($a, $b);
$default = 42;
$c = $helper ? $helper : $default;

不适当的使用

三元运算符并不总是值得使用,因为它在编写复杂和嵌套条件时往往会引起混乱。

自己看一个例子。

$valid = true;
$lang = '法国';
$x = $valid
? ($lang === '法国' ? 'oui' : '是')
: ($lang === '法国' ? '非' : '从');

你会不会一看就知道变量$x会包含oui的值?

经过一段时间的练习,你可能会,但这并不是正确的答案。:)

验证值的(不)存在并使用默认值

三元运算符在常规验证(不)存在的值和使用其他默认值方面最为强大。

例如,我们想检查一篇文章是否存在一个主类别,如果没有,就输出一个替换信息。

echo $mainCategory ?? '该类别并不存在';

操作符??(两个问号)检查变量$mainCategory是否存在并且不是null。它的工作方式与isset()函数相同。

验证一个价值的空性

一个非常有用的结构,用于验证输出值是否为空(即不是 "空"、"0"、"假 "或"''(空字符串))。

这可以写成如下。

$a = 5;
$b = 3;
$default = 42;
$c = my_function($a, $b) ?: $default;

首先调用function($a, $b),然后测试它的值,如果它不是空的,就立即传递给$c变量,否则就使用$default变量。

?:运算符的工作原理与条件中的!=运算符一样(无论数据类型如何都是假的),可以通过像猫王头发的笑脸来记忆,例如。

支持旧版本的PHP

?:操作符从PHP7开始工作。 在旧版本中,我们必须使用if (..)条件,它可以实现同样的行为。请记住,三元运算符实际上只是写出由条件处理的相同事物的一个快捷方式。

一个值的不存在可以用isset()函数来检查,它检查变量是否存在,并且不是空的(null)。

而不是代码。

$a = 5;
$b = 3;
$c = $a ?? $b;

然后我们写下旧的替代方案。

$a = 5;
$b = 3;
$c = isset($a) && $a ?? $b;

警告: isset()的顺序和变量本身很重要。如果我们颠倒顺序,变量不存在,就会引发对不存在的变量的访问错误。

Jan Barášek   Více o autorovi

Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.

Rád vám pomůžu:

Související články

1.
2.
Status:
All systems normal.
2024