Тернарный оператор является более коротким аналогом IF и в некоторых случаях позволяет значительно сократить код.
Допустим, нужно вычислить стоимость доставки товара. Если цена товара ниже 1000р - доставка должна быть 200р. Если стоимость товара 1000 или выше - доставка должна быть 100р.
$price = 100;
if($price < 1000)
$shipping = 200;
else
$shipping = 100;
$price - стоимость товара, $shipping - стоимость доставки.
С помощью тернарного оператора можно сократить условие до одной строчки кода:
$price = 100;
$shipping = $price < 1000 ? 200 : 100;
Сначала указывается условие, затем символ ?, затем значение при истинности условия, затем :, затем значение при ложности условия.
Иногда в интернете можно встретить примеры, где условие заключено в скобки, вроде такого:
$price = 100;
$shipping = ($price < 1000) ? 200 : 100;
Это не обязательно, но если вам так визуально удобней - можно начать с этого.
Многие новички сторонятся этого оператора из-за специфического внешнего вида.
Я рекомендую использовать его как можно чаще, чтобы быстрей привыкнуть к синтаксису. Это очень удобный оператор.
Также вместо обычных значений в тернарный оператор можно подставить вызов функций:
$i = 0;
$i === 0 ? print('Ноль') : phpinfo();
Кстати, одно из различий между echo и print заключается в том, что print можно подставить в тернарный оператор, а echo нельзя.
Также тернарные операторы можно вкладывать один в другой, создавая множественные условия:
$price = 5000;
// Обычный синтаксис
if($price > 10000)
$shipping = 0;
elseif($price > 500)
$shipping = 100;
else
$shipping = 200;
// Сокращённый синтаксис
$shipping = $price > 10000 ? 0 : ($price > 500 ? 100 : 200);
Вложенный тернарный оператор обязательно помещается в скобки.
Вложенные тернарные операторы взрывают мозг, поэтому их лучше никогда не использовать.
Также в тернарном операторе есть возможность пропуска средней части:
<?php
$var = 5;
echo $var ?: 10;
?>
В этом случае тернарный оператор вернёт значение $var, если оно после приведения к булеву типу будет true. А если будет false, то вернётся указанное справа значение.
<?php
$price = 100;
var_dump ($price ?: 10); // 100 потому что $price == true
$price = 0;
var_dump($price ?: 10); // 10 потому что $price == false
?>