Тернарные операторы

?: Условный тернарный оператор

Выражение (expr1) ? (expr2) : (expr3) интерпретируется как expr2, если expr1 имеет значение true, или как expr3, если expr1 имеет значение false.

$result = (2 > 1) ? 'если true' : 'если false';

//аналогично этому
if(2 > 1) {
    $result = 'если true';
}else{
    $result = 'если false';
}

Кророткий тернарный оператор (expr1) ?: (expr2)

$result = $var ?: '';

//аналогично этому
if($var) {
    $result = $var;
}else{
    $result = '';
}

Цепочка коротких тернарных операторов (?:) вернёт первый аргумент, который оценивается как не ложное значение.

$res = 0 ?: 1 ?: 2 ?: 3; //1
$res = 0 ?: 0 ?: 2 ?: 3; //2
$res = 0 ?: 0 ?: 0 ?: 3; //3

?? Оператор объединения с null

Выражение (expr1) ?? (expr2) вычисляется так: expr2, если expr1 равен null и expr1 в противном случае. То же самое что и ?: но возвращает первый результат который не null. То есть вернёт даже false, главное что бы не null.

$res = 0 ?? 1 ?? 2 ?? 3; //0
$res = null ?? null ?? 2 ?? 3; //2
$res = false ?? 1 ?? 2 ?? 3; //false

Удобно использовать для определения дефолтного значения, если первый операнд равен null.

// если $_POST['action'] не равен null то вернёт его, 
// а если равен null то вернёт 'default'
$action = $_POST['action'] ?? 'default';

// Пример выше аналогичен следующему коду
if (isset($_POST['action'])) {
    $action = $_POST['action'];
} else {
    $action = 'default';
}

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

// если таких эллементов нету в массиве $json, то вернёт "default"
// и не вызовет ошибку про то что нет таких ключей в массиве
$data = $json["thumbnail"]["source"] ?? "default";


// Пример выше аналогичен следующему коду
if (isset($json["thumbnail"]["source"])){
    $data = $json["thumbnail"]["source"];
}else{
    $data = "default";
}

Last updated