Тернарный оператор в PHP
Существует распространенная в программировании ситуация, когда в случае выполнения некоторого условия переменной необходимо присвоить одно значение и в случае невыполнения этого условия другое значение. В следующем примере переменной $min
присваивается наименьшее из значений $foo
и $bar
c помощью конструкции if else
:
<?
$foo = 1;
$bar = 2;
if ($foo < $bar) {
$min = $foo;
}
else {
$min = $bar;
}
Для быстрой записи подобных условий, был разработан специальный условный оператор
, выполняющий данные действия. Сокращенный способ присваивания значения переменной на основе выполнения того или иного условия. Этот оператор использует три операнда, по этой причине его часто называют тернарным и записывается с помощью двух знаков:
?
:
Синтаксис тернарного оператора
Первым делом интерпретатор PHP вычисляет значение условия, если оно возвращает true
, переменной присваивается значение выражения находящегося по левую сторону от двоеточия, в данном случае выражение1
. Если условие возвращает false
, переменной присваивается значение выражения находящегося справа от двоеточия, в данном случае выражение2
. Скобки вокруг условного выражения не обязательны, но их довольно часто употребляют для более легкого визуального восприятия тернарного оператора. Тернарные выражения вычисляются слева направо.
Обычный тернарный оператор
Синтаксис:
$variable = (условие) ? значение_если_истина : значение_если_ложь;
С помощью тернарного оператора можно записать предыдущий пример следующим образом:
<?
$foo = 1;
$bar = 2;
$min = ($foo < $bar) ? $foo : $bar;
Сначала проверяется результат работы условного выражения, если условие вернет значение true
переменной $min
присвоиться значение переменной $foo
, если false
значение переменной $bar
.
В данном случае переменная $min
будет равна 1
.
Краткий тернарный оператор
Синтаксис:
$variable = (условие) ?: значение_если_ложь;
Краткий тернарный оператор ?:
работает почти так же, как и обычный тернарный оператор, но он пропускает часть «если истина», возвращая тестовое выражение в случае истины.
<?
$name = 'Александр';
$displayName = $name ?: 'Гость';
В данном случае переменная $displayName
будет равна Александр
.
Оператор объединения с null или оператор Null coalescing
Синтаксис:
$variable = значение1 ?? значение2 ?? значение3;
Оператор ??
проверяет, является ли значение NULL
или не установлено
, и возвращает первое не NULL
значение из списка.
<?
$foo = 1;
$bar = 2;
$data = $test ?? $foo ?? $bar;
В данном случае переменная $data
будет равна 1
, по причине что переменная $test
не установлена.
Вложенный тернарный оператор
<?
$code = 0;
// следующий код на первый взгляд должен выводить 'Успешно', однако он выведет 'Предупреждение' происходит это потому что тернарное выражение вычисляется слева направо
$msg = ($code == 0) ? 'Успешно' : ($code == 1) ? 'Предупреждение' : 'Ошибка';
// разберем почему так происходит, первое выражение ($code == 0) ? 'Успешно' возвращает строку 'Успешно', далее эта строка преобразуется в булево значение true и вычисляется второе выражение, т.е. вычисляется уже (true) ? 'Предупреждение' : 'Ошибка'. Таким образом возвращается значение 'Предупреждение' второго (вложенного) выражения
echo $msg;
// чтобы предыдущий код работал корректно, нужно пользоваться скобками, перепишем пример так, чтобы работал как задумано
$msg = ($code == 0) ? 'Успешно' : (($code == 1) ? 'Предупреждение' : 'Ошибка');
echo $msg;
Несмотря на то, что тернарные операторы могут быть вложенными, использовать их таким образом не рекомендуется. Поэтому вложенные тернарные операторы лучше заменить на конструкцию if-else
или switch-case
.