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

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

Тернарный оператор является более коротким аналогом 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
?>

Комментарии