Главное отличие — в условии проверки. "?:" — тернарный оператор . «??" — оператор объединения с null.
Оператор ?:
$result = $value ?: $default;
Это сокращение от $result = $value ? $value : $default;
Что считается false (falsy):
nullfalse0(ноль)""(пустая строка)"0"(строка с нулем)[](пустой массив)
Оператор ??
$result = $value ?? $default;
Это сокращение от $result = isset($value) ? $value : $default;
Проверяет только на null (и несуществующие переменные без ошибки).
Откуда это взялось
?:(тернарный оператор) — есть почти во всех C-подобных языках (C, C++, Java, C#). Просто PHP добавил возможность опускать среднюю часть (x ?: y). Это нововведение появилось в PHP 5.3.??(Null coalescing) — был украден (позаимствован) из мира C# (где он называется null-coalescing operator). В PHP его добавили в PHP 7, потому что разработчики устали писатьisset($_GET['key']) ? $_GET['key'] : 'default'.
Хороший ли тон это использовать
Однозначно ДА, но с оговорками.
Это считается современным и читаемым кодом. PHP-сообщество (особенно в версиях 7.4+) активно использует ??, потому что он безопасен и предсказуем.
Правила хорошего тона (Best Practices):
- Используйте
??для работы с массивами ($_GET,$_POST,$_SESSION). Это лучший друг программиста.php$name = $_POST[‘name’] ?? ‘Гость’; // Без ошибки, если ключа нет - Используйте
?:осторожно. Он хорош, только если вы уверены, что0,""иfalseдля вас — это «плохо».php// Плохо (сломается на 0) $count = getCount() ?: 10; // Хорошо (если getCount() возвращает -1 при ошибке) $count = getCount() ?: 10; // -1 это true, ок. - Цепочки (
??) — это супер-сила (доступно с PHP 7+):php// Ищет первое значение, которое не null $user = $_GET[‘user’] ?? $_POST[‘user’] ?? $_SESSION[‘user’] ?? ‘Аноним’;
Секретный бонус: Оператор ?-> (Nullsafe)
Раз уж мы говорим про PHP 8, есть еще оператор ?-> (nullsafe operator).
// Без него (если $user = null, будет ошибка) $city = $user->getProfile()->getAddress()->city; // С ним (если $user = null, просто вернет null, ошибки не будет) $city = $user?->getProfile()?->getAddress()?->city ?? 'Неизвестно';
Это позволяет безопасно ходить по цепочке методов, не проверяя каждый раз if (!is_null(...)).
Итог: Используйте ?? для данных извне (формы, БД), ?: для логических проверок, и ваш код будет чистым и надежным.