Menu

Тернарный оператор PHP: короткий ?: и вложенный тернарный

Тернарный оператор PHP это if/else в одну строку: $result = $condition ? 'yes' : 'no';. Короткий тернарный ?: (оператор Элвиса), чем он отличается от ??, почему вложенным тернарным с PHP 8 нужны скобки и когда match понятнее.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Тернарный оператор это 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();.

Иллюстрация языков программирования Coddy

Учитесь программировать с Coddy

НАЧАТЬ