Skip to content

Instantly share code, notes, and snippets.

@dduleone
Created December 4, 2014 18:38
Show Gist options
  • Save dduleone/51d3920b4e4dcecd6af0 to your computer and use it in GitHub Desktop.
Save dduleone/51d3920b4e4dcecd6af0 to your computer and use it in GitHub Desktop.
PubSub Test
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 />
<?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;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment