PHP 8.5: Новые функции `get_exception_handler` и `get_error_handler`
PHP поддерживает определение пользовательских обработчиков ошибок и исключений, они вызываются в случае ошибки либо неперехваченного исключения. При необходимости можно восстановить предыдущие обработчики.
До PHP 8.5 не было прямого способа получения информации о текущих зарегистрированных обработчиках ошибок или исключений. Приходилось использовать хак: временно установить новый обработчик, после чего немедленно восстановить предыдущий:
$current_error_handler = set_error_handler('valid_callback');
restore_error_handler();Этот обходной путь громоздкий и сопряжён с риском ошибок.
В PHP 8.5 добавлены две функции, предоставляющие эту функциональность.
function get_error_handler(): ?callable
function get_exception_handler(): ?callableЭти функции возвращают текущие обработчики ошибок и исключений соответственно. Если обработчики отсутствуют, возвращается null.
Возвращаемый обработчик является точным значением обратного вызова, переданного в set_error_handler или set_exception_handler для его определения.
Ошибки и исключения
В PHP существуют два механизма обработки непредвиденных ситуаций:
- Ошибки (класс
Error) — возникают автоматически при выполнении кода - Исключения (класс
Exception) — создаются программно черезthrow
Ключевые различия:
- Ошибки обрабатываются через
set_error_handler() - Исключения обрабатываются через
set_exception_handler() - Ошибки не могут быть перехвачены напрямую
- Исключения требуют явной обработки в
try-catch
Понимание этих различий важно для эффективного использования новых функций получения обработчиков.
Установка обработчиков ошибок и исключений
Функции установки пользовательского обработчика принимают в качестве параметра вызываемый объект — функцию, вызываемую при возникновении ошибки или необработанного исключения.
set_error_handler('my_custom_error_handler_function');
set_exception_handler('my_custom_exception_handler_function');При установке обработчиков функции set_*_handler возвращают существующие обработчики.
Функция get_error_handler
Функция get_error_handler, возвращающая текущий обработчик ошибок или null:
/**
* Возвращает текущий обработчик ошибок или null, если он не установлен.
* @return callable|null
*/
function get_error_handler(): ?callable {}Функция get_exception_handler
Функция get_exception_handler возвращает текущий обработчик исключений и работает аналогично get_error_handler.
/**
* Возвращает текущий обработчик исключений или null, если он не установлен.
* @return callable|null
*/
function get_exception_handler(): ?callable {}Пример использования
Механизм работы функций получения обработчика ошибок и обработчика исключений идентичен. В обоих случаях возвращается текущий обработчик или null.
set_error_handler(fn() => null);
get_error_handler(); // object(Closure)#1 (3) {...}Полифилл
Поскольку функции set_error_handler и set_exception_handler возвращают предыдущий обработчик при установке нового, с их помощью легко реализовать полифилл:
/**
* Возвращает текущий обработчик ошибок или null, если он не установлен.
* @return callable|null
*/
function get_error_handler(): ?callable {
$handler = set_error_handler(null);
restore_error_handler();
return $handler;
}
/**
* Возвращает текущий обработчик исключений или null, если он не установлен.
* @return callable|null
*/
function get_exception_handler(): ?callable {
$handler = set_exception_handler(null);
restore_exception_handler();
return $handler;
}Влияние на обратную совместимость
get_error_handler и get_exception_handler — новые функции, представленные в PHP 8.5. Если существующее PHP-приложение не объявляет идентичные имена функций в глобальном пространстве имён, это изменение не влияет на обратную совместимость.
Кроме того, можно реализовать полифилл для этих двух функций.