In this example , when trigger error it will call FileErrorLogger and EmailErrorLogger: <?php /** * * The observer pattern example * */ class ErrorHandler { var $_observers = array (); var $_error_info; function attach($observer) { $this->_observers [] = new $observer; } function detach($observer) { foreach ( array_keys ( $this->_observers ) as $key ) { if ($this->_observers [$key] === $observer) { unset ( $this->_observers [$key] ); return; } } } function notify() { foreach ( array_keys ( $this->_observers ) as $key ) { $observer = $this->_observers [$key]; $observer->update ( $this ); } } function getState() { return $this->_error_info; } function setState($info) { $this->_error_info = $info; $this->notify (); } } function &getErrorHandlerInstance() { static $instance = array (); if (! $instance) $instance [0] = & new ErrorHandler ( ); return $instance [0]; } //error handler function function observer_error_handler($errno,$info) { $eh = getErrorHandlerInstance (); $eh->attach('FileErrorLogger'); $eh->attach('EmailErrorLogger'); $eh->setState($info); } class FileErrorLogger { function update($error_handler) { $error = $error_handler->getState (); echo 'the file error log '.$error; } } class EmailErrorLogger { function update($error_handler) { $error = $error_handler->getState (); echo 'the email error log '.$error; } } set_error_handler('observer_error_handler'); trigger_error('error message !' , E_USER_NOTICE); //when trigger error it will call the both of FileErrorLogger and EmailErrorLogger