Это фрагмент моего исходного кода, который я тестирую для обработки ошибки.
Метод FIRST вызывает fatalErrorHandler()
, но метод SECOND не вызывает fatalErrorHandler()
. Что может быть причиной?
ПЕРВЫЙ
<?php //error_reporting(0); function fatalErrorHandler() { echo 'YAY IT WORKED'; } # Registering shutdown function register_shutdown_function('fatalErrorHandler'); // let force a Fatal error -- function does not exist functiontest(); echo "hello"; ?>
вывод:
Неустранимая ошибка: вызов неопределенной функции functiontest () в … test2.php в строке 12 YAY IT WORKED
ВТОРОЙ
<?php //error_reporting(0); function fatalErrorHandler() { echo 'YAY IT WORKED'; } # Registering shutdown function register_shutdown_function('fatalErrorHandler'); // let force a Fatal error -- function does not exist functiontest(); function foo () { } function foo() { } echo "hello"; ?>
Вывод:
Неустранимая ошибка: невозможно обновить foo () (ранее объявлено в … test / test2.php: 16) в файле ../test2.php в строке 20
fatalErrorHandler не получает вызов в этом сценарии. Зачем?
В PHP вы можете использовать функцию перед ее определением. Я думаю, это означает, что интерпретатор должен разобрать все функции до того, как он начнет выполнение. Так register_shutdown_function
еще не вызывается, когда эта ошибка обнаружена.
Вы можете проверить это, переместив определение дубликатов функций в отдельный файл и включив его в include
или require
.