Created
December 4, 2014 18:38
-
-
Save dduleone/51d3920b4e4dcecd6af0 to your computer and use it in GitHub Desktop.
Revisions
-
dduleone created this gist
Dec 4, 2014 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,26 @@ beforeEventEvent::firealt<br /> beforeEventEvent::fire<br /> ...Event...<br /> afterEventEvent::fire<br /> Round 1:<br /> Array<br /> (<br /> [beforeEvent] => Array<br /> (<br /> [beforeEventEvent::firealt] => firealt<br /> [beforeEventEvent] => fire<br /> )<br /> <br /> [afterEvent] => Array<br /> (<br /> [afterEventEvent] => firealt<br /> )<br /> <br /> )<br /> ...Event...<br /> Round 2:<br /> Array<br /> (<br /> [beforeEvent] => <br /> [afterEvent] => <br /> )<br /> This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,201 @@ <?php /* http://writecodeonline.com/php/?code=%0A%0A$_NL2BR%20=%20TRUE;%0A%0A%0A//%20more:%20http://baylorrae.com/php-pubsub/%0A%0Aclass%20PubSub%20{%0A%0A%20private%20static%20$events%20=%20array();%20//%20all%20subscriptions%0A%0A%20//%20Don%27t%20allow%20PubSub%20to%20be%20initialized%20outside%20this%20class%0A%20private%20function%20__construct%20()%20{%20}%0A%20private%20function%20__clone%20()%20{%20}%0A%0A%20/**%0A%20*%20Adds%20a%20subscription%20to%20the%20stack%0A%20*%0A%20*%20@param%20string%20$name%0A%20*%20@param%20function%20$callback%20needs%20to%20be%20callable%20with%20call_user_func()%0A%20*%20@return%20void%0A%20*%20@author%20Baylor%20Rae%27%0A%20*/%0A%20public%20static%20function%20subscribe%20($name,%20$callback)%20{%0A%20//%20Make%20sure%20the%20subscription%20isn%27t%20null%0A%20if%20(empty(self::$events[$name]))%20{%0A%20self::$events[$name]%20=%20array();%0A%20}%0A%0A%20//%20push%20the%20$callback%20onto%20the%20subscription%20stack%0A%20array_push(self::$events[$name],%20$callback);%0A%20}%0A%0A%20/**%0A%20*%20Calls%20the%20last%20subscription%20in%20the%20stack%0A%20*%0A%20*%20@param%20string%20$name%0A%20*%20@param%20string%20$params%0A%20*%20@return%20false%20if%20fails%0A%20*%20@author%20Baylor%20Rae%27%0A%20*/%0A%20public%20static%20function%20publish%20($name,%20$params%20=%20%27%27)%20{%0A%0A%20//%20Check%20to%20see%20if%20the%20subscribe%20isn%27t%20null%0A%20if%20(empty(self::$events[$name]))%20{%0A%20return%20false;%0A%20}%0A%0A%0A%20//%20Gets%20all%20parameters%20passed%20to%20the%20function%0A%20//%20and%20removes%20the%20first,%20which%20is%20$name%0A%20$params%20=%20func_get_args();%0A%20array_shift($params);%0A%0A%0A%20$results%20=%20array();%0A%20//%20Loop%20through%20all%20the%20events%20and%20call%20them%0A%20foreach%20(self::$events[$name]%20as%20$event)%20{%0A%20if%20(is_callable($event))%20{%0A%20$results[$event]%20=%20call_user_func_array($event,%20$params);%0A%20}%20elseif%20(is_callable($event.%20%22::fire%22))%20{%0A%20$results[$event]%20=%20call_user_func_array($event%20.%20%22::fire%22,%20$params);%0A%20}%0A%20}%0A%0A%20return%20$results;%0A%20}%0A%0A%20public%20static%20function%20unsubscribe($name)%20{%0A%20if%20(!empty(self::$events[$name]))%20{%0A%20unset(self::$events[$name]);%0A%20}%0A%20}%0A%0A}%0A%0A%0Aclass%20Event%20{%0A%20public%20static%20$init;%0A%0A%20public%20static%20function%20init%20($subscriptions%20=%20%22%22)%20{%0A%20$class%20=%20get_called_class();%0A%0A%20if%20(!is_array(self::$init))%20{%0A%20self::$init%20=%20array();%0A%20}%0A%0A%20if%20(!isset(self::$init[$class]))%20{%0A%20self::$init[$class]%20=%20FALSE;%0A%20}%0A%0A%20if%20(self::$init[$class]%20==%20TRUE)%20{%0A%20return;%0A%20}%0A%0A%20self::$init[$class]%20=%20TRUE;%0A%0A%20if%20(!empty($subscriptions))%20{%0A%20foreach%20($subscriptions%20as%20$sub)%20{%0A%20PubSub::subscribe($sub-%3Eevent,%20$sub-%3Eroutine);%0A%20}%0A%20}%0A%0A%20}%0A%0A%20public%20static%20function%20makeHandler%20($eventName,%20$routine)%20{%0A%20$event%20=%20new%20stdClass();%0A%20$event-%3Eevent%20=%20$eventName;%0A%20$event-%3Eroutine%20=%20$routine;%0A%20return%20$event;%0A%20}%0A%0A}%0A%0A%0Aclass%20beforeEventEvent%20extends%20Event%20{%0A%0A%20public%20static%20function%20fire%20()%20{%0A%20echo%20get_class()%20.%20%22::fire\n%22;%0A%20return%20%27fire%27;%0A%20}%0A%0A%0A%20public%20static%20function%20firealt%20()%20{%0A%20echo%20get_class()%20.%20%22::firealt\n%22;%0A%20return%20%27firealt%27;%0A%20}%0A%0A%0A%20public%20static%20function%20init%20($subscriptions%20=%20%22%22)%20{%0A%20$events%20=%20array();%0A%20$events[]%20=%20Event::makeHandler(%27beforeEvent%27,%20%27beforeEventEvent::firealt%27);%0A%20$events[]%20=%20Event::makeHandler(%27beforeEvent%27,%20%27beforeEventEvent%27);%0A%0A%0A%20if%20(!empty($subscriptions))%20{%0A%20foreach%20($subscriptions%20as%20$sub)%20{%0A%20$events[]%20=%20$sub;%0A%20}%0A%20}%0A%0A%20parent::init($events);%0A%20}%0A}%0A%0A%0Aclass%20afterEventEvent%20extends%20Event%20{%0A%0A%20public%20static%20function%20fire%20()%20{%0A%20echo%20get_class()%20.%20%22::fire\n%22;%20%0A%20return%20%27firealt%27;%0A%20}%0A%0A%20public%20static%20function%20init%20($subscriptions%20=%20%22%22)%20{%0A%20$events%20=%20array();%0A%20$events[]%20=%20Event::makeHandler(%27afterEvent%27,%20%27afterEventEvent%27);%0A%0A%0A%20if%20(!empty($subscriptions))%20{%0A%20foreach%20($subscriptions%20as%20$sub)%20{%0A%20$events[]%20=%20$sub;%0A%20}%0A%20}%0A%0A%20parent::init($events);%0A%20}%0A}%0A%0AbeforeEventEvent::init();%0AafterEventEvent::init();%0A%0Aob_start();%0A//%20Basic%20usage%0A$results%20=%20array();%0A$results[%27beforeEvent%27]%20=%20PubSub::publish(%27beforeEvent%27);%0Aecho%20%22...Event...\n%22;%0A$results[%27afterEvent%27]%20=%20PubSub::publish(%27afterEvent%27);%0A%0Aecho%20%22\tRound%201:\n%22;%0Aprint_r($results);%0A%0APubSub::unsubscribe(%27beforeEvent%27);%0APubSub::unsubscribe(%27afterEvent%27);%0A%0A$results%20=%20array();%0A$results[%27beforeEvent%27]%20=%20PubSub::publish(%27beforeEvent%27);%0Aecho%20%22...Event...\n%22;%0A$results[%27afterEvent%27]%20=%20PubSub::publish(%27afterEvent%27);%0A%0Aecho%20%22\tRound%202:\n%22;%0Aprint_r($results);%0A$ob%20=%20ob_get_clean();%0Aif%20($_NL2BR)%20{%0A%20$buffer%20=%20str_replace(%22\n%22,%20%22%3Cbr%20/%3E\n%22,%20$ob);%0A}%20else%20{%0A%20$buffer%20=%20$ob;%0A}%0Aecho%20$buffer; */ $_NL2BR = TRUE; // more: http://baylorrae.com/php-pubsub/ class PubSub { private static $events = array(); // all subscriptions // Don't allow PubSub to be initialized outside this class private function __construct () { } private function __clone () { } /** * Adds a subscription to the stack * * @param string $name * @param function $callback needs to be callable with call_user_func() * @return void * @author Baylor Rae' */ public static function subscribe ($name, $callback) { // Make sure the subscription isn't null if (empty(self::$events[$name])) { self::$events[$name] = array(); } // push the $callback onto the subscription stack array_push(self::$events[$name], $callback); } /** * Calls the last subscription in the stack * * @param string $name * @param string $params * @return false if fails * @author Baylor Rae' */ public static function publish ($name, $params = '') { // Check to see if the subscribe isn't null if (empty(self::$events[$name])) { return false; } // Gets all parameters passed to the function // and removes the first, which is $name $params = func_get_args(); array_shift($params); $results = array(); // Loop through all the events and call them foreach (self::$events[$name] as $event) { if (is_callable($event)) { $results[$event] = call_user_func_array($event, $params); } elseif (is_callable($event. "::fire")) { $results[$event] = call_user_func_array($event . "::fire", $params); } } return $results; } public static function unsubscribe($name) { if (!empty(self::$events[$name])) { unset(self::$events[$name]); } } } class Event { public static $init; public static function init ($subscriptions = "") { $class = get_called_class(); if (!is_array(self::$init)) { self::$init = array(); } if (!isset(self::$init[$class])) { self::$init[$class] = FALSE; } if (self::$init[$class] == TRUE) { return; } self::$init[$class] = TRUE; if (!empty($subscriptions)) { foreach ($subscriptions as $sub) { PubSub::subscribe($sub->event, $sub->routine); } } } public static function makeHandler ($eventName, $routine) { $event = new stdClass(); $event->event = $eventName; $event->routine = $routine; return $event; } } class beforeEventEvent extends Event { public static function fire () { echo get_class() . "::fire\n"; return 'fire'; } public static function firealt () { echo get_class() . "::firealt\n"; return 'firealt'; } public static function init ($subscriptions = "") { $events = array(); $events[] = Event::makeHandler('beforeEvent', 'beforeEventEvent::firealt'); $events[] = Event::makeHandler('beforeEvent', 'beforeEventEvent'); if (!empty($subscriptions)) { foreach ($subscriptions as $sub) { $events[] = $sub; } } parent::init($events); } } class afterEventEvent extends Event { public static function fire () { echo get_class() . "::fire\n"; return 'firealt'; } public static function init ($subscriptions = "") { $events = array(); $events[] = Event::makeHandler('afterEvent', 'afterEventEvent'); if (!empty($subscriptions)) { foreach ($subscriptions as $sub) { $events[] = $sub; } } parent::init($events); } } beforeEventEvent::init(); afterEventEvent::init(); ob_start(); // Basic usage $results = array(); $results['beforeEvent'] = PubSub::publish('beforeEvent'); echo "...Event...\n"; $results['afterEvent'] = PubSub::publish('afterEvent'); echo "\tRound 1:\n"; print_r($results); PubSub::unsubscribe('beforeEvent'); PubSub::unsubscribe('afterEvent'); $results = array(); $results['beforeEvent'] = PubSub::publish('beforeEvent'); echo "...Event...\n"; $results['afterEvent'] = PubSub::publish('afterEvent'); echo "\tRound 2:\n"; print_r($results); $ob = ob_get_clean(); if ($_NL2BR) { $buffer = str_replace("\n", "<br />\n", $ob); } else { $buffer = $ob; } echo $buffer;