Тернарный оператор это if/else, который помещается в одно выражение: condition ? valueIfTrue : valueIfFalse. Он возвращает одно из двух значений, поэтому его можно присвоить, вывести через echo или передать в функцию.
Поменяйте $age на 15, а $items на 3 и запустите снова. Обратите внимание на скобки вокруг тернарного оператора в последней строке: без них . сначала склеил бы строки, и результат получился бы не тем.
Тернарный оператор в HTML-шаблонах
Тернарный оператор это обычный способ выбрать CSS-класс, подпись или атрибут внутри шаблона. Этот блок читает ?stock= из URL: запустите его, затем нажимайте на ссылки во вкладке Page, и тот же скрипт будет выполняться снова с другим значением.
<?= ... ?> это короткая запись <?php echo ... ?>, она сохраняет читаемость однострочных условий внутри разметки.
Короткий тернарный ?: (оператор Элвиса)
Если убрать среднюю часть, получится $a ?: $b: он возвращает $a, когда $a истинно, иначе $b. Это удобно для значений по умолчанию, когда пустая строка или 0 тоже должны заменяться запасным значением.
Ложные значения это false, 0, 0.0, "", "0", [] и null. Если "0" в ваших данных настоящий ответ (поле количества, PIN-код), короткий тернарный оператор его выбросит.
?: и ??
Они похожи, но проверяют разное. ?: берёт запасное значение, когда левая часть ложна. ?? берёт запасное значение, только когда левая часть равна null или не задана, и не выдаёт предупреждения об отсутствующей переменной или ключе массива.
Используйте ??, когда "значения может не быть" (данные запроса, массивы настроек, необязательные ключи). Используйте ?:, когда "значение есть, но может быть пустым". ?? и ??= подробно разобраны на странице об операторе объединения с null.
Вложенному тернарному нужны скобки
PHP 7 читал a ? b : c ? d : e слева направо, в отличие почти от всех других языков, и выдавал неверные результаты. PHP 8 отказывается угадывать:
<?php
echo $score > 90 ? "A" : $score > 80 ? "B" : "C";
PHP Fatal error: Unparenthesized `a ? b : c ? d : e` is not supported. Use either `(a ? b : c) ? d : e` or `a ? b : (c ? d : e)` in /home/index.php on line 2
Добавьте скобки вокруг внутреннего тернарного оператора, и всё заработает:
Исключение составляет короткий тернарный оператор: $a ?: $b ?: $c разрешено без скобок, как в примере с оператором Элвиса выше.
match(true), когда веток больше двух
Вложенный тернарный оператор с тремя или четырьмя уровнями трудно читать даже со скобками. match с true в качестве проверяемого значения проверяет условия сверху вниз и возвращает первую подходящую ветку:
Оставьте тернарный оператор для двух исходов в одной строке, а как только понадобится третий, берите match или цепочку if/elseif.
Часто задаваемые вопросы
Что такое тернарный оператор в PHP?
Короткая форма if/else, которая возвращает значение: $label = $age >= 18 ? 'adult' : 'minor';. Если условие перед ? истинно, используется выражение после ?, иначе выражение после :.
Что означает ?: в PHP?
$a ?: $b это короткий тернарный оператор (его ещё называют оператором Элвиса). Он возвращает $a, если $a истинно, иначе $b, поэтому '' ?: 'default' равно 'default'. Это то же самое, что $a ? $a : $b, но $a вычисляется только один раз.
Можно ли вкладывать тернарные операторы в PHP?
Только со скобками. Начиная с PHP 8 $a ? 'x' : $b ? 'y' : 'z' это фатальная ошибка, поэтому пишите $a ? 'x' : ($b ? 'y' : 'z'). Для более чем двух веток легче читаются match(true) или цепочка if/elseif.
Можно ли использовать тернарный оператор без else?
Нет, тернарному оператору всегда нужны обе ветки. Для "взять это значение или запасное" пишите $x ?: 'default' или $x ?? 'default'; чтобы что-то сделать только при выполнении условия, пишите обычный if или $condition && doSomething();.