Optional Chaining in PHP
Is there optional chaining in PHP?
Есть ли возможность?
В JS есть такая штука как Optional Chaining. Про эту фичу есть в заметке
Суть проста: мы можем обратиться к несуществующей ветви объекта и при этом не получить ошибку. А есть ли такая возможность в PHP? Более того, в пхп у нас есть не только объекты как экземпляры класса, но и такая структура данных как ассоциативный массив (по сути словарь в терминах того же python).
Если в PHP обратиться к несуществующей ветке объекта или словаря (ассоциативного массива), то будут два типа ошибок:
- Notice в случае доступа к несуществующему полю у существующего
- Warning в случае доступа к несуществующему полю у несуществующего
Кто-то предлагает просто все это дело мьютить символом собака:
<?php declare(strict_types=1);$a = [];
$r = @$a[‘b’][‘c’][‘d’];// Без скрытия сообщений об ошибках // Notice: Undefined index: b // Warning: Trying to access array offset on value of type null // Warning: Trying to access array offset on value of type null#EOF#
В случае с объектом типа stdClass:
<?php declare(strict_types=1);$a = (object)[];
$r = @$a->b->c->d;// Без скрытия сообщений об ошибках // Warning: Undefined property: stdClass::$a // Warning: Attempt to read property 'b' on null // Warning: Attempt to read property 'c' on null#EOF#
Но скрытие ошибок не лучший вариант, более того, это не избавляет от срабатывания кастомных обработчиков ошибок.
Другой вариант — использовать isset
. Прелесть оператора в том, что ему можно передать всю цепочку:
<?php$r = isset($a['b']['c']['d']) ? $a['b']['c']['d'] : null;#EOF#
И это не вызовет ошибок. Но запись все еще длинная. Самый лучший и верный вариант это использовать Nullish Coalescing (объединение с Null) оператор:
<?php declare(strict_types=1);$r = $a['b']['c']['d'] ?? null;$r = $a->b->c->d ?? null;#EOF#
Коротко, без генерации ошибок. Не путать с краткой записью тернарного оператора ( ?:
), который делает логическую проверку, но не делает проверку на isset
. Более того, логическая проверка меняет поведение и результат будет иной. Так что самый верный вариант - это Nullish Coalescing оператор.
Использование Empty
В PHP есть еще одна встроенная функция — empty. Она точно так же как isset
делает проверку на существование, но дополнительно еще делает проверку на пустое значение. Пустое значение это:
Это так же может быть удобно, если вам нужно еще дополнительно сделать проверку:
В случае с isset
и empty
переменная может вообще не существовать изначально, точно так же как и с оператором Nullish Coalescing.
Вот такой вот простой лайфхак.
Geekjob.ru — анонимный поиск работы без палева где можно найти новую работу без проблем на текущем месте. Только для IT, никакого “левого” стафа. Только релевантные предложения.
New.HR — место где помогают найти работу мечты. Работаем только с отборными вакансиями в сфере IT & Digital. Помогаем кандидатам найти работу по душе. Работаем с кандидатами, которые не ищут работу!
Подписывайтесь на Телеграм канал. Следить за обновлениями и прочими материалами от меня можно именно там: @prowebit . В этом канале публикую различные новости и мысли, которых может не быть в этом блоге. Подписывайтесь!