Цепочка коротких тернарных операторов (?:) вернёт первый аргумент, который оценивается как не ложное значение.
?? Оператор объединения с null
Выражение (expr1) ?? (expr2) вычисляется так: expr2, если expr1 равен null и expr1 в противном случае.
То же самое что и ?: но возвращает первый результат который не null. То есть вернёт даже false, главное что бы не null.
Удобно использовать для определения дефолтного значения, если первый операнд равен 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";
}