Cannot redeclare - неуловимая фатальная ошибка в PHP
Вот такая ситуация. Чем поймать?
test.php
<?
ini_set('display_errors', 1);
set_error_handler('error_handler', E_ALL );
include('functions.php');
try {
include('functions.php');
}
catch ( Exception $e ){
echo 'exception';
}
function error_handler( $errno, $errstr, $errfile, $errline, $errcontext ){
echo 'error handler';
}
?>
functions.php
<?
function test(){
}
?>
В общем ничем не ловится.
Fatal error: Cannot redeclare test() (previously declared in /var/www/site/functions.php:5) in /var/www/site/functions.php on line 5
Копаться в сишных исходниках PHP нет желания, поэтому обратился к разработчикам языка и они помогли с решением.
Официальный ответ здесь:
We throw Error in PHP 7 for most things. For everything else, it's really fatal and you only will be able to do cleanup in a register_shutdown_function() for example.
Решение: использовать register_shutdown_function().
register_shutdown_function('my_register_shutdown_function');
function my_register_shutdown_function(){
$error = error_get_last();
if( $error !== null ){
$arr = [
E_ERROR,
E_CORE_ERROR,
E_USER_ERROR,
E_COMPILE_ERROR,
E_RECOVERABLE_ERROR,
E_PARSE
];
if( in_array( $error['type'], $arr, true ) == true ){
// $traces = debug_backtrace();
// print_r($traces);
// print_r($error);
// Показать стилизованную страницу Service Temporarily Unavailable.
require_once('http_pages/503.php');
}
}
}