Blame | Letzte Änderung | Log anzeigen | RSS feed
<?PHP/*** example that shows how to create event bubbling** This allows you to create several levels of event handling and you* may post a notification to any of these levels.** After a notification has been posted on a lower level, it will bubble* up through all other levels.** @package Event_Dispatcher* @subpackage Examples* @author Stephan Schmidt <schst@php.net>*//*** load Event_Dispatcher package*/require_once 'Event/Dispatcher.php';/*** example sender class*/class sender{var $_dispatcher = null;function sender(&$dispatcher){$this->_dispatcher = &$dispatcher;}function foo($bubble = true){$this->_dispatcher->post($this, 'onFoo', 'Some Info...', true, $bubble);}}/*** example observer*/function receiver1(&$notification){echo "receiver 1 received notification<br />\n";}/*** example observer*/function receiver2(&$notification){echo "receiver 2 received notification<br />\n";}/*** example observer*/function receiver3(&$notification){echo "receiver 3 received notification<br />\n";}// get the different dispatchers$dispatcher1 = &Event_Dispatcher::getInstance();$dispatcher2 = &Event_Dispatcher::getInstance('child');$dispatcher3 = &Event_Dispatcher::getInstance('grandchild');// create senders in two different levels$sender1 = &new sender($dispatcher1);$sender2 = &new sender($dispatcher2);// build three levels$dispatcher1->addNestedDispatcher($dispatcher2);$dispatcher2->addNestedDispatcher($dispatcher3);// add observers in level one and two$dispatcher1->addObserver('receiver1', 'onFoo');$dispatcher2->addObserver('receiver2', 'onFoo');// this will bubble up from 1 to 3echo 'sender1->foo()<br />';$sender1->foo();// this will not bubble upecho '<br />';echo 'sender1->foo(), but disable bubbling<br />';$sender1->foo(false);// this will bubble up from 2 to 3echo '<br />';echo 'sender2->foo()<br />';$sender2->foo();// This observer will receive the two pending notifications on level 3echo '<br />';echo 'dispatcher3->addObserver()<br />';$dispatcher3->addObserver('receiver3', 'onFoo');// remove one level$success = $dispatcher1->removeNestedDispatcher($dispatcher2);if ($success === true) {echo '<br />';echo 'removed nested dispatcher2 from dispatcher1<br />';}// this will stay in level 1echo 'sender1->foo()<br />';$sender1->foo();// this will bubble up from 2-3echo '<br />';echo 'sender2->foo()<br />';$sender2->foo();?>