Тернарный оператор в PHP
Существует распространенная в программировании ситуация, когда в случае выполнения некоторого условия переменной необходимо присвоить одно значение и в случае невыполнения этого условия другое значение. В следующем примере переменной $min
присваивается наименьшее из значений $foo
и $bar
c помощью конструкции if else
:
<?
if ($foo < $bar) {
$min = $foo;
}
else {
$min = $bar;
}
Для быстрой записи подобных условий, был разработан специальный условный оператор
, выполняющий данные действия. Сокращенный способ присваивания значения переменной на основе выполнения того или иного условия. Этот оператор использует три операнда, по этой причине его часто называют тернарным и записывается с помощью двух знаков:
?
:
С помощью тернарного оператора можно записать предыдущий пример следующим образом:
<?
$min = ($foo < $bar) ? $foo : $bar;
Сначала проверяется результат работы условного выражения, если условие вернет значение true
переменной $min
присвоиться значение переменной $foo
, если false
значение переменной $bar
.
У тернарного оператора есть возможность не писать его среднюю часть:
<?
$a1 = 5;
echo (($a1) ?: 10);
Выражение ($a1) ?: 10
возвращает значение переменной $a1
, если $a1
имеет значение TRUE
и 10
в противном случае.
Синтаксис тернарного оператора
Первым делом интерпретатор PHP вычисляет значение условия, если оно возвращает true
, переменной присваивается значение выражения находящегося по левую сторону от двоеточия, в данном случае выражение1
. Если условие возвращает false
, переменной присваивается значение выражения находящегося справа от двоеточия, в данном случае выражение2
. Скобки вокруг условного выражения не обязательны, но их довольно часто употребляют для более легкого визуального восприятия тернарного оператора. Тернарные выражения вычисляются слева направо.
Вложенный тернарный оператор
<?
$code = 0;
// следующий код на первый взгляд должен выводить 'Успешно', однако он выведет 'Предупреждение' происходит это потому что тернарное выражение вычисляется слева направо
$msg = ($code == 0) ? 'Успешно' : ($code == 1) ? 'Предупреждение' : 'Ошибка';
// разберем почему так происходит, первое выражение ($code == 0) ? 'Успешно' возвращает строку 'Успешно', далее эта строка преобразуется в булево значение true и вычисляется второе выражение, т.е. вычисляется уже (true) ? 'Предупреждение' : 'Ошибка'. Таким образом возвращается значение 'Предупреждение' второго (вложенного) выражения
echo $msg;
// чтобы предыдущий код работал корректно, нужно пользоваться скобками, перепишем пример так, чтобы работал как задумано
$msg = ($code == 0) ? 'Успешно' : (($code == 1) ? 'Предупреждение' : 'Ошибка');
echo $msg;
Несмотря на то, что тернарные операторы могут быть вложенными, использовать их таким образом не рекомендуется. Поэтому вложенные тернарные операторы лучше заменить на конструкцию if-else
или switch-case
.