С
Сергей Предводителев
@sergei_predvoditelev1.2K подп.
1.3Kпросмотров
6 февраля 2026 г.
Score: 1.4K
🌿 Про стек вызовов в PHP при возникновении ошибки В PHP 8.5 использование null в качестве ключа массива было помечено как устаревшее. При переезде одного приложения на PHP 8.5 у меня всплыла эта ошибка. Для обработки исключений и ошибок в проекте используется Yii Error Handler, который в случае ошибки выводит полный стек вызовов. Вот только последнего вызова в стеке не оказалось 🤷‍♂️. В процессе исправления Yii Error Handler всплыл интересный нюанс связанный с пользовательским обработчиком ошибок и стеком вызовов. ⭐️ Вызов ошибки через trigger_error() set_error_handler( static function (){ print_r(debug_backtrace(0)); } ); trigger_error('test'); В этом случае в стеке мы видим два вызова, trigger_error и closure (пользовательский обработчик ошибок): [ [ "function" => "{closure}", "args" => [ 1024, "test", "/projects/tmp/backtrace/trigger.php", 11, ], ], [ "file" => "/projects/tmp/backtrace/trigger.php", "line" => 11, "function" => "trigger_error", "args" => ["test"], ], ] ⭐️ Вызов ошибки внутри PHP Для примера, используем устаревшую функцию, использование которой приводит к ошибке типа "Deprecated": set_error_handler( static function (){ print_r(debug_backtrace(0)); } ); utf8_encode('test'); В этом случае в стеке только один вызов, причем {closure} как бы вызывается вместо устаревшей функции: [ [ "file" => "/projects/tmp/backtrace/deprecated.php" "line" => 11 "function" => "{closure}" "args" => [ 8192, "Function utf8_encode() is deprecated", "/projects/tmp/backtrace/deprecated.php", 11, ], ], ] ⭐️ Решение PHP ведёт себя так в версиях 8.1 — 8.5, другие не проверял. Не стал глубоко копать, с чем связано такое поведение, это больше тема для рубрики «Кодемонология» в группе Кирилла Несмеянова в PHPeople. Просто внёс правки с учётом описанного выше. Yii Error Handler удаляет из стека последний вызов, чтобы не показывать вызов внутреннего обработчика ошибок. Для случая, когда в последнем вызове есть ключ file теперь вместо удаления всего вызова удаляются только ключи, относящиеся к обработчику ошибок: function, class, type и args.
1.3K
просмотров
2255
символов
Да
эмодзи
Нет
медиа

Другие посты @sergei_predvoditelev

Все посты канала →
🌿 Про стек вызовов в PHP при возникновении ошибки В PHP 8.5 — @sergei_predvoditelev | PostSniper