Как я могу заставить set_error_handler() вызывать метод для объекта?
Я думаю об использовании функциональности set_error_handler()
в PHP для обработки большинства ошибок PHP в одном месте (запись их в файл). Из документации видно, что я могу передать имя функции в set_error_handler()
. Приятно! Но у меня есть объект ErrorManager
, у которого есть хороший метод регистрации. Я хочу использовать этот объект ErrorManager
, написать для него специальный метод-обработчик ошибок и заставить set_error_handler
вызвать его ErrorManager
.
Могу я просто сделать что-то вроде?:
set_error_handler($this->customErrorHandler);
Или это будет недействительным?
Ответы
Ответ 1
Передайте массив объекта и имя метода, которое будет вызываться:
set_error_handler(array($this, 'customErrorHandler'));
set_error_handler()
принимает callback:
Некоторые функции, такие как call_user_func() или usort() принимают определяемые пользователем функции обратного вызова в качестве параметра. Функции обратного вызова могут быть не только простые функции, но и объект методы, включая статический класс Методы.
Функция PHP передается по имени как строка. Любой встроенный или пользовательская функция может использоваться, кроме языковых конструкций, таких как: array(), echo(), empty(), eval(), exit(), isset(), list(), print() или снята с охраны().
Метод экземпляра объекта передается как массив, содержащий объект с индексом 0 и имя метода при индексе 1.
Статические методы класса также могут быть передается без экземпляра объекта этого класса, пройдя класс вместо объекта с индексом 0.
Помимо общих пользовательских функция, create_function() также может использовать для создания анонимного функция обратного вызова. Начиная с PHP 5.3.0 он можно также передать закрытие параметр обратного вызова.
(выделено курсивом)
Ответ 2
В PHP 5.3 вы можете сделать это в закрытии:
$that = $this;
set_error_handler( function() use ($that) { $that->customErrorHandler(); } );
Ответ 3
set_error_handler
принимает callback
как параметр.
Цитирование этой страницы:
Метод экземпляра объекта передается как массив, содержащий объект с индексом 0 и имя метода при индексе 1.
В вашем случае вам нужен обратный вызов, соответствующий методу (Called 'customErrorHandler
') объекта (здесь $this
); обратный вызов будет тогда:
array($this, 'customErrorHandler')
Итак, вы должны использовать эту часть кода:
set_error_handler(array($this, 'customErrorHandler'));