Тернарный оператор ¶
Ещё одним условным оператором является тернарный оператор «?:».
Пример #3 Присваивание значения по умолчанию
<?php
// Пример использования тернарного оператора
$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];
// Приведённый выше код аналогичен следующему блоку с использованием if/elseif (empty($_POST[‘action’])) {
$action = ‘default’;
} else {
$action = $_POST[‘action’];
}
?>
Выражение (expr1) ? (expr2) : (expr3)
интерпретируется как expr2, если expr1 имеет значение true
, или как expr3, если expr1 имеет значение false
.
Также стало возможным не писать среднюю часть тернарного оператора. Выражение expr1 ?: expr3
оценивается как результат expr1, если результат выражения expr1 оценивается как true
и expr3 в противном случае. Выражение expr1 в этом случае оценивается только один раз.
Замечание: Обратите внимание, что тернарный оператор является выражением и трактуется не как переменная, а как результат выражения. Это важно знать, если вы хотите вернуть переменную по ссылке. Выражение
return $var == 42 ? $a : $b;
не будет работать в функции, возвращающей значение по ссылке, а в более поздних версиях PHP также будет выдано предупреждение.
Замечание:
Рекомендуется избегать «нагромождения» тернарных выражений. Поведение PHP неочевидно при использовании более чем одного тернарного оператора без скобок в одном выражении по сравнению с другими языками. Действительно, до PHP 8.0.0 троичные выражения оценивались лево-ассоциативными, а не право-ассоциативными, как в большинстве других языков программирования. Использование лево-ассоциативности устарело в PHP 7.4.0. Начиная с PHP 8.0.0, тернарный оператор неассоциативен.
Пример #4 Неочевидное поведение тернарного оператора
// однако, он выводит ‘t’ до PHP 8.0.0
<?php
// на первый взгляд, следующий код должен вывести 'true'
echo (true ? 'true' : false ? 't' : 'f');
// это потому, что тернарные выражения левоассоциативны// это намного более очевидная версия вышеприведённого кода
echo ((true ? ‘true’ : false) ? ‘t’ : ‘f’);// здесь видно, что первое выражение вычисляется в ‘true’, которое
// в свою очередь вычисляется в (bool)true, таким образом возвращая истинную ветвь
// второго тернарного выражения.
?>
HOME YASK
У нас есть переменная name_person. Если значение этой переменной “Артем” то вывести в консоль “директор”, если значение “Максим” то вывести в консоль “преподаватель”, с любым другим значением вывести в консоль “студент”
Решить задачу с помощью нескольких тернарных операторов, без использования if
$a = $light == «green» ? «go» : ($light == «yellow» ? «wait» : «stop»);