Optional Chaining in PHP

Is there optional chaining in PHP?

Fullstack CTO
2 min readJun 29, 2020

Есть ли возможность?

В 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 . В этом канале публикую различные новости и мысли, которых может не быть в этом блоге. Подписывайтесь!

--

--

Fullstack CTO
Fullstack CTO

Written by Fullstack CTO

CTO and co-founder at NEWHR & Geekjob

No responses yet