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