$a ?? $b(null coalescing) - повертає$a, якщо воно існує і неnull, інакше$b. Не кидає попереджень на неіснуючих змінних і ключах.$a ?: $b(скорочений тернарний, «elvis») - повертає$a, якщо воно істинне, інакше$b. Для0,'','0',[],falseтеж поверне$b.
$page = $_GET['page'] ?? 1; // ключа немає - 1, без попередження
$page = $_GET['page'] ?: 1; // ключа немає - попередження "Undefined array key"
$discount = 0;
$discount ?? 10; // 0 - нуль не null
$discount ?: 10; // 10 - нуль хибний
$title = '';
$title ?? 'Без назви'; // ''
$title ?: 'Без назви'; // 'Без назви'
Як обирати:
??- «значення за замовчуванням, якщо нічого немає»: ключі масиву, необов'язкові параметри, конфігурація. Найчастіший випадок.?:- коли порожній рядок, нуль чи порожній масив справді треба замінити: показати «Без назви» замість порожнього заголовка.
Присвоєння з ??= (PHP 7.4):
$options['timeout'] ??= 30; // присвоїти, лише якщо ключа немає чи там null
Ланцюжки: $a ?? $b ?? $c - перше значення, що не null. Разом із nullsafe-оператором: $user?->profile?->city ?? 'Невідомо'.