Разница между ?? и ?:

Главное отличие — в условии проверки. "?:" — тернарный оператор . «??" — оператор объединения с null.

Оператор ?:

$result = $value ?: $default;

Это сокращение от $result = $value ? $value : $default;

Что считается false (falsy):

  • null
  • false
  • 0 (ноль)
  • "" (пустая строка)
  • "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):

  1. Используйте ?? для работы с массивами ($_GET$_POST$_SESSION). Это лучший друг программиста.php$name = $_POST[‘name’] ?? ‘Гость’; // Без ошибки, если ключа нет
  2. Используйте ?: осторожно. Он хорош, только если вы уверены, что 0"" и false для вас — это «плохо».php// Плохо (сломается на 0) $count = getCount() ?: 10; // Хорошо (если getCount() возвращает -1 при ошибке) $count = getCount() ?: 10; // -1 это true, ок.
  3. Цепочки (??) — это супер-сила (доступно с 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(...)).

Итог: Используйте ?? для данных извне (формы, БД), ?: для логических проверок, и ваш код будет чистым и надежным.

Запись опубликована в рубрике Основы. Добавьте в закладки постоянную ссылку.

Добавить комментарий