PHP код падает при присвоении значения элементу второго уровня многомерного массива
Столкнулся со странной проблемой.
Имеется следующий "легаси" код:
$array['a']['b'] = 'val';
То есть значение присваивается сразу элементу второго уровня, без инициализации первого.
Код выполняется без проблем на всех серверах, кроме одного, на котором он падает без каких-либо ошибок и записей в лог. Не могу понять в чём может быть причина.
Конфигурация проблемного сервера:
- Ubuntu 20.04
- Apache 2.4
- Nginx 1.19
- PHP 8.0
Локально конфигурация идентичная, но код работает. Тестировал так же на других серверах с различными версиями php, проблем не было.
Заранее спасибо.
P.S.: Я понимаю что проблема решается элементарно инициализацией первого уровня, просто интересна причина подобного поведения.
Ответы (1 шт):
Если взять данный код $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.