Тернарный оператор в PHP

Александр Кичатов

Тернарный оператор является более простым аналогом IF и в некоторых случаях позволяет значительно сократить количество кода.

Представим задачу: при стоимости товара менее 1000р доставка должна стоить 200р, иначе - 100р.

<?php
    $price = 100;

    if($price < 1000)
        $shipping = 200;
    else
        $shipping = 100;

С помощью тернарного оператора мы можем сократить условие до одной строчки кода:

<?php
    $price = 100;

    $shipping = $price < 1000 ? 200 : 100;

Сначала мы указываем условие, затем символ ?, затем значение при истинности условия, затем :, затем значение при ложности условия.

Многие новички сторонятся этого оператора из-за специфического внешнего вида.

Я рекомендую использовать его везде, где только возможно, чтобы быстрей привыкнуть к синтаксису. Это очень удобный оператор.

Но одним лишь присваиванием возможности тернарного оператора не ограничиваются, мы можем подставить туда и выполнение операций с данными, и вывод функций, и даже вывод на экран:

<?php
    $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
?>

Комментарии