Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I make set_error_handler() call a method on an object?

Tags:

php

I think about using the set_error_handler() functionality in PHP to handle most of the PHP errors in one place (logging them to a file). From the documentation it looks like if I can pass a function name to set_error_handler(). Nice! But I have an ErrorManager object which has a nice logging method. I want to use that ErrorManager object and write an special error handler method for it, and have set_error_handler call that ErrorManager.

Could I just do something like?:

set_error_handler($this->customErrorHandler);

Or would that be invalid?

like image 766
openfrog Avatar asked Dec 27 '09 19:12

openfrog


3 Answers

Pass in an array of the object and the method name to be called:

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

set_error_handler() takes a callback:

Some functions like call_user_func() or usort() accept user-defined callback functions as a parameter. Callback functions can not only be simple functions, but also object methods, including static class methods.

A PHP function is passed by its name as a string. Any built-in or user-defined function can be used, except language constructs such as: array(), echo(), empty(), eval(), exit(), isset(), list(), print() or unset().

A method of an instantiated object is passed as an array containing an object at index 0 and the method name at index 1.

Static class methods can also be passed without instantiating an object of that class by passing the class name instead of an object at index 0.

Apart from common user-defined function, create_function() can also be used to create an anonymous callback function. As of PHP 5.3.0 it is possible to also pass a closure to a callback parameter.

(emphasis added)

like image 76
cletus Avatar answered Oct 21 '22 14:10

cletus


In PHP 5.3 you could do it in a closure:

$that = $this;
set_error_handler( function() use ($that) { $that->customErrorHandler(); } );
like image 34
selfawaresoup Avatar answered Oct 21 '22 16:10

selfawaresoup


set_error_handler accepts a callback as parameter.

Quoting that page :

A method of an instantiated object is passed as an array containing an object at index 0 and the method name at index 1.


In your case, you want a callback that corresponds to a method (Called 'customErrorHandler') of an object (here, $this) ; the callback would then be :

array($this, 'customErrorHandler')

So, you'd use this portion of code :

set_error_handler(array($this, 'customErrorHandler'));
like image 4
Pascal MARTIN Avatar answered Oct 21 '22 16:10

Pascal MARTIN