PHP код падает при присвоении значения элементу второго уровня многомерного массива

Столкнулся со странной проблемой.

Имеется следующий "легаси" код:

$array['a']['b'] = 'val';

То есть значение присваивается сразу элементу второго уровня, без инициализации первого.

Код выполняется без проблем на всех серверах, кроме одного, на котором он падает без каких-либо ошибок и записей в лог. Не могу понять в чём может быть причина.

Конфигурация проблемного сервера:

  • Ubuntu 20.04
  • Apache 2.4
  • Nginx 1.19
  • PHP 8.0

Локально конфигурация идентичная, но код работает. Тестировал так же на других серверах с различными версиями php, проблем не было.

Заранее спасибо.

P.S.: Я понимаю что проблема решается элементарно инициализацией первого уровня, просто интересна причина подобного поведения.


Ответы (1 шт):

Автор решения: u_mulder

Если взять данный код $array['a']['b'] = 'val'; и запустить, то как видишь - ни в одной из поддерживаемых версий php не падает ни предупреждений, ни ошибок.

Теперь модифицируем код следующим образом:

$array['a'] = '42';
$array['a']['b'] = 'val';

Запускаем

И видим, что в восьмых версиях падает FatalError:

Uncaught TypeError: Cannot access offset of type string on string in

Таким образом приходим к выводу, что где-то ранее в коде $array['a'] инициализируется каким-то значением, отличным от массива.

Это поведение описано здесь: https://www.php.net/manual/en/migration80.incompatible.php#migration80.incompatible.core.other, группа "A number of warnings have been converted into Error exceptions".

И да, чтобы ошибка записывалась в лог - должен быть выставлен соответствующий уровень error_reporting.

→ Ссылка