2009-12-27 10 views
31

Pienso en usar la funcionalidad set_error_handler() en PHP para manejar la mayoría de los errores de PHP en un solo lugar (registrándolos en un archivo). De la documentación parece que puedo pasar un nombre de función a set_error_handler(). ¡Bonito! Pero tengo un objeto ErrorManager que tiene un buen método de registro. Quiero usar ese objeto ErrorManager y escribir un método especial de manejo de errores para él, y hacer que set_error_handler llame a ese ErrorManager.¿Cómo puedo hacer que set_error_handler() invoque un método en un objeto?

podría simplemente hacer algo como

set_error_handler($this->customErrorHandler); 

? ¿O eso sería inválido?

+1

Desde el entrada manual para set_error_handler() (http://php.net/manual/en/function.set-error-handler.php): "... una matriz que contiene una referencia de objeto y un nombre de método también se pueden suministrar como error_handler ". – GZipp

Respuesta

50

Pass en una matriz del objeto y el nombre del método que se llamará:

set_error_handler(array($this, 'customErrorHandler')); 

set_error_handler() toma un callback: user

Algunas funciones como call_user_func() o usort() aceptar -defined callback funciona como un parámetro. Las funciones de devolución de llamada no solo pueden ser funciones simples, sino también el objeto métodos, incluidos los métodos de clase estática .

Una función de PHP se pasa por su nombre como una cadena. Se puede utilizar cualquier función incorporada o definida por el usuario, excepto construcciones de lenguaje como: matriz(), echo(), vacío(), eval(), exit(), isset(), list() , imprimir() o unset().

un método de un objeto instanciado se pasa como una matriz que contiene un objeto en el índice 0 y el nombre del método en el índice 1.

métodos de clase estáticas también se pueden pasaron sin instanciar un objeto de esa clase haciendo pasar el nombre de la clase lugar de un objeto en el índice 0.

Aparte de común función definida por el usuario , create_function() también puede se utiliza para crear una función de devolución de llamada anónima . A partir de PHP 5.3.0, también es posible pasar un cierre a un parámetro de devolución de llamada.

(énfasis añadido)

4

set_error_handler acepta un callback como parámetro.

Citando que la página:

un método de un objeto instanciado es pasado como una matriz que contiene un objeto en el índice 0 y el nombre del método en el índice 1.


En su caso, que desea una devolución de llamada que corresponde a un método (llamado 'customErrorHandler') de un objeto (en este caso, $this); la devolución de llamada sería entonces:

array($this, 'customErrorHandler') 

Por lo tanto, tendrá que utilizar esta porción de código:

set_error_handler(array($this, 'customErrorHandler')); 
6

En PHP 5.3 que podría hacerlo en un cierre:

$that = $this; 
set_error_handler(function() use ($that) { $that->customErrorHandler(); }); 
+0

esto parece lógicamente – streetparade

+1

'$ this' no está disponible dentro de los cierres en 5.3, ¿no es así? – neoascetic

+1

cierto, tendría que crear una variable adicional para él. Actualicé el código en consecuencia ... – selfawaresoup

Cuestiones relacionadas