Оператор объединения с null (`??`), появившийся в PHP 7, — это элегантный способ избавиться от постоянных проверок с помощью `isset()`. Он позволяет задать значение по умолчанию для переменной, если она не определена или равна `null`. Это делает код более чистым, коротким и читаемым, а также помогает избежать предупреждений (Notice). В этом тренажере мы пройдем путь от основ синтаксиса до практического применения оператора `??` в работе с массивами и формами. Вы научитесь заменять старые конструкции `if-isset` на современный лаконичный код, предсказывать результат и исправлять ошибки.
- Модуль 1: Основы синтаксиса PHP
- Модуль 2: Переменные и типы данных
- Модуль 3: Операторы
- Модуль 4: Условные конструкции
- Модуль 5: Циклы
- Модуль 6: Массивы
- Индексированные массивы.
- Ассоциативные массивы.
- Многомерные массивы.
- Добавление элементов в массив.
- Удаление элементов из массива.
- Функция count().
- Функция array_push() и array_pop().
- Функция array_shift() и array_unshift().
- Функция array_merge().
- Функция array_slice().
- Функция array_splice().
- Функция in_array().
- Функция array_search().
- Функция array_keys() и array_values().
- Функция array_unique().
- Функция array_reverse().
- Сортировка: sort(), rsort().
- Сортировка: asort(), arsort().
- Сортировка: ksort(), krsort().
- Функция array_map().
- Функция array_filter().
- Функция array_reduce().
- Функция array_walk().
- Функция array_column().
- Деструктуризация массивов.
- Модуль 7: Функции
- Объявление функций.
- Вызов функций.
- Параметры функций.
- Возврат значений return.
- Значения параметров по умолчанию.
- Передача по значению.
- Передача по ссылке.
- Переменное количество аргументов.
- Оператор распаковки ....
- Типизация параметров.
- Типизация возвращаемых значений.
- Nullable типы.
- Union типы (PHP 8).
- Именованные аргументы (PHP 8).
- Анонимные функции.
- Стрелочные функции.
- Замыкания и use.
- Рекурсивные функции.
- Глобальные переменные в функциях.
- Статические переменные в функциях.
- Модуль 8: Работа со строками
- Одинарные и двойные кавычки.
- Экранирование символов.
- Heredoc и Nowdoc синтаксис.
- Функция strlen().
- Функция substr().
- Функция str_replace().
- Функция strpos() и strrpos().
- Функция explode() и implode().
- Функция trim(), ltrim(), rtrim().
- Функция strtolower() и strtoupper().
- Функция ucfirst() и ucwords().
- Функция str_repeat().
- Модуль 9: Суперглобальные переменные
- Модуль 10: Работа с формами
- Модуль 11: Работа с файлами
- Модуль 12: Дата и время
- Модуль 13: Регулярные выражения
- Модуль 14: Сессии и Cookie
- Модуль 15: Include и Require
- Модуль 16: Объектно-ориентированное программирование
- Модуль 17: Пространства имен
- Модуль 18: Обработка ошибок и исключений
- Модуль 19: Работа с JSON и XML
- Модуль 20: Работа с базами данных MySQLi
- Модуль 21: PDO - PHP Data Objects
- Модуль 22: Composer и зависимости
- Модуль 23: cURL и HTTP запросы
- Модуль 24: REST API
- Модуль 25: Безопасность
- Модуль 26: Генераторы и итераторы
- Модуль 27: Reflection API
- Модуль 28: Работа с изображениями
- Модуль 29: Отправка email
- Модуль 30: Паттерны проектирования
- Модуль 31: Тестирование
- Модуль 32: Продвинутые возможности PHP 8+
Основы синтаксиса оператора ??
Оператор объединения с null состоит из двух вопросительных знаков. Он проверяет левый операнд, и если тот `null` или не существует, возвращает правый. Заполните пропуск, чтобы переменной `$username` было присвоено значение 'Guest', так как переменная `$name` не определена.
// Переменная $name не существует
$username = $name input1S 'Guest';
echo $username;Когда переменная определена
Что выведет этот код? Оператор `??` срабатывает только если переменная слева от него не определена или равна `null`. В данном случае переменная `$user_input` имеет конкретное значение.
$user_input = 'Alice';
$name = $user_input ?? 'Anonymous';
echo $name;Когда переменная равна null
Теперь переменная `$user_input` явно установлена в `null`. Проанализируйте код и введите в поле, какое значение будет присвоено переменной `$name` и выведено на экран.
$user_input = null;
$name = $user_input ?? 'Anonymous';
echo $name;Исправление старого синтаксиса
Раньше для подобной проверки приходилось использовать тернарный оператор вместе с `isset()`. В этом коде смешались старый и новый подходы. Исправьте строку, чтобы она использовала только современный оператор объединения с `null`.
<?php// $post['title'] не существует$title = $post['title'] ? : 'Без заголовка';echo $title;?>Отличие от тернарного оператора: значение 0
Это ключевое отличие `??` от тернарного оператора `?:`. Значения, которые считаются "ложными" (false, 0, пустая строка ''), но не являются `null`, не заставляют оператор `??` срабатывать. Что выведет этот код?
$items_count = 0;
$display_count = $items_count ?? 'N/A';
echo $display_count;Замена isset() на ??
Перед вами классическая проверка существования переменной с помощью `isset()` и тернарного оператора. Соберите в левом поле эквивалентную, но более короткую конструкцию с использованием оператора объединения с `null`.
// Старый код:// $page = isset($_GET['page']) ? $_GET['page'] : 1;$page = $_GET['page']??1;isset()?:Работа с несуществующим ключом массива
Одно из самых частых применений `??` — безопасное извлечение данных из массива, когда вы не уверены, существует ли ключ. Что выведет этот код, если в массиве `$user` нет ключа 'lastname'?
$user = ['firstname' => 'John'];
$lastName = $user['lastname'] ?? 'Doe';
echo $lastName;Цепочка операторов ??
Операторы `??` можно выстраивать в цепочку для проверки нескольких значений по очереди. Он вернёт первое же существующее и не равное `null` значение. Заполните пропуски, чтобы создать цепочку, которая ищет имя пользователя сначала в `$_POST`, затем в `$_GET`, и только потом использует 'Guest'.
// Предположим, $_POST['name'] и $_GET['name'] не определены
$name = $_POST['name'] input1S $_GET['name'] input2S 'Guest';
echo $name;