$obj, 'method' => $method, 'params' => $params, 'catch' => $catch ); return true; } /** * Call a specific event * @param $event Name of event * @return boolean */ static function call($event) { // Check for event list if(!isset(self::$events[$event])) { return false; } // For each registered object foreach(self::$events[$event] as $call) { $obj = $call['obj']; $method = $call['method']; $params = $call['params']; $catch = $call['catch']; // Check if object still exists if($obj && is_object($obj)) { // Call event try { $obj->$method($params); } catch(Exception $e) { if(!$catch) { // Raise exception throw $e; } } } } return true; } } // Code for testing / demonstration /* class Object1 { function __construct() { EventHandler::register('shutdown', $this, 'my_shutdown', 'Custom Shutdown Param'); } function my_shutdown($param='Default Shutdown Param') { echo "Object1::my_shutdown() - Called with: '$param'\n"; } } class Error1 { function __construct() { // Not existing method EventHandler::register('shutdown', $this, 'not_exists'); // Private Method EventHandler::register('shutdown', $this, 'my_shutdown'); } private function my_shutdown() { echo 'SHOULD NOT BE CALLED!'; } } class Moribundus { function __destruct() { // Call shutdown event EventHandler::call('shutdown'); } } $morb = new Moribundus; $obj1 = new Object1; $err1 = new Error1; unset($morb); */