Тернарный оператор использует три операнда и записывается с помощью двух знаков ? :. Он является единственным оператором в PHP, который использует более двух операндов.

Пример тернарного (условного) оператора:

# Синтаксис
$result = condition ? value1 : value2;

# более развернуто
$result = (условие) ? значение_если_истина : значение_если_ложь;

В зависимости от условия condition тернарная операция возвращает второй или третий операнд (value1 или value2). Если условие равно true, то возвращается второй операнд - value1. Если условие равно false, то третий - value2.

Пример:

$age = 25;
$message = ($age >= 18) ? 'Доступ разрешен' : 'Доступ запрещен'; // Доступ разрешен

Тоже самое с использованием if-else:

if ($age >= 18) {
    $message = 'Доступ разрешен';
} else {
    $message = 'Доступ запрещен';
}

# С использованием альтернативного синтаксиса if-else
if ($age >= 18):
    $message = 'Доступ разрешен';
else:
    $message = 'Доступ запрещен';
endif;

# Или так
if ($age >= 18) $message = 'Доступ разрешен';
else $message = 'Доступ запрещен';

Начиная с PHP версии 5.3 можно использовать сокращенный вариант записи тернарного оператора.

Оператор ?: — бинарный оператор, который возвращает первый операнд если он истинен, и второй (по умолчанию) в ином случае. Еще его называют Elvis, потому что это слово похоже на else if.

Пример короткого тернарного оператора:

# Синтаксис
$result = (условие) ?: значение_если_ложь;

# Пример
$name = 'John';
$userName = $name ?: 'Guest';

Примечание:

  • $name представлен в булевом контексте.
  • Если $name будет true — это же значение будет присвоено переменной $userName.
  • Если $name будет false — переменная $userName получит значение по умолчанию (Guest).

Тернарные операторы могут быть вложенными и представлять из себя цепочки:

$message = ($age >= 18) 
    ? 'Доступ разрешен' 
    : (($age >= 14) ? 'Доступ разрешен с ограничениями' : 'Доступ запрещен');
Цепочки таких операторов могут значительно перегружать код визуально, особенно, если их очень много. В качестве решения можно вернуться к стандартным конструкциям if-else или if-elseif

Оператор объединения с null (??) является синтаксическим сахаром для достаточно распространённого действия, когда совместно используются тернарный оператор и функция isset(). Он возвращает первый операнд, если он задан и не равен null, а в обратном случае возвращает второй операнд, и так далее.

# Синтаксис
$result = значение1 ?? значение2 ?? значение3;

# Пример
$result = $array['key'] ?? 'Apple';
# Если $array['key'] не установлен или NULL, переменная $result будет установлена в 'Apple'.

# Аналогичен этому коду
$result = isset($array['key']) ? $array['key'] : 'Apple';

# Или этому
if(isset($array['key'])) $result = $array['key'];
else $result = 'Apple';

Можно и так:

$array['key'] ??= 'Apple';
var_dump($array['key']); // Apple