Использование трехкомпонентного оператора ?
позволяет избежать многословности инструкций if
и else
. Необычность этого оператора заключается в том, что он использует не два, как большинство других операторов, а три операнда.
В главе «Введение в РНР» уже состоялось краткое знакомство с этим оператором при выяснении разницы между print
и echo
, где он приводился в качестве примера оператора, который хорошо работает с print
, но не работает с echo
.
Оператору ?
передаются выражение, которое он должен вычислить, и два выполняемых оператора: один для выполнения, когда результат вычисления выражения TRUE
, а другой — когда FALSE
.
В примере показан код, который может использоваться для вывода предупреждения об уровне топлива в автомобиле на его панель приборов.
Пример. Использование оператора “?”
<?рhр
echo $fuel <= 1 ? "Требуется дозаправка" : "Топлива еще достаточно";
?>
1 галлон (американский) = 3,79 л.
Если топлива остается всего 1 галлон или меньше (иными словами, переменная $fuel
имеет значение, равное единице или меньше нее), этот оператор возвращает предыдущей команде echo
строку «Требуется дозаправка». В противном случае он возвращает строку «Топлива еще достаточно». Значение, возвращаемое оператором ?
, можно также присвоить какой-нибудь переменной (см. следующий пример).
Пример. Присваивание условного результата оператора “?” переменной
<?php
$enough = $fuel <= 1 ? FALSE : TRUE;
?>
В этом примере переменной $enough
будет присвоено значение TRUE
только в том случае, если в баке более 1 галлона топлива, в противном случае ей будет присвоено значение FALSE
.
Если вы считаете синтаксис оператора ?
слишком запутанным, можете вместо него воспользоваться инструкцией if
, но о нем все равно нужно знать, поскольку он может встретиться в программном коде, созданном другим программистом. Чтение кода, в котором используется этот оператор, может быть сильно затруднено из-за частого использования в нескольких местах одной и той же переменной. Например, весьма популярен код такого вида:
$saved = $saved >= $new ? $saved : $new;
Понять, что он делает, можно только после тщательного разбора:
$saved = // Присваивание значения переменной $saved
$saved >= $new // Сравнение $saved и $new
? // Если сравнение выдает истинный результат ...
$saved // ... ей присваивается текущее значение $saved
: // Если сравнение выдает ложный результат ...
$new; // ... ей присваивается значение переменной $new
Это весьма компактный способ отслеживания самого большого значения, которое может встретиться в процессе выполнения программы. Самое большое значение содержится в переменной $saved
и при поступлении нового значения сравнивается со значением переменной $new
. Программисты, освоившие оператор ?
, считают, что для таких коротких сравнений его применять удобнее, чем инструкции if
. Если этот оператор не используется для создания компактного кода, то он обычно применяется для принятия решений, умещающихся на одной строке, например для проверки того, установлено ли значение переменной, перед передачей ее функции.
Альтернативный синтаксис | Организация циклов |