Урок 13 из 29
В прогрессе

13php Тернарный оператор ¶

Урок
Материалы

Тернарный оператор ¶

Ещё одним условным оператором является тернарный оператор «?:».

Пример #3 Присваивание значения по умолчанию

<?php
// Пример использования тернарного оператора
$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];
// Приведённый выше код аналогичен следующему блоку с использованием if/else
if (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 Неочевидное поведение тернарного оператора

<?php
// на первый взгляд, следующий код должен вывести 'true'
echo (true ? 'true' : false ? 't' : 'f');
// однако, он выводит ‘t’ до PHP 8.0.0
// это потому, что тернарные выражения левоассоциативны// это намного более очевидная версия вышеприведённого кода
echo ((true ? ‘true’ : false) ? ‘t’ : ‘f’);// здесь видно, что первое выражение вычисляется в ‘true’, которое
// в свою очередь вычисляется в (bool)true, таким образом возвращая истинную ветвь
// второго тернарного выражения.
?>


HOME YASK

  1. У нас есть переменная name_person. Если значение этой переменной “Артем” то вывести в консоль “директор”, если значение “Максим” то вывести в консоль “преподаватель”, с любым другим значением вывести в консоль “студент”

Решить задачу с помощью нескольких тернарных операторов, без использования if

$a = $light == «green»  ?  «go» : ($light == «yellow» ? «wait» : «stop»);