Skip to content

Instantly share code, notes, and snippets.

@dduleone
Created December 4, 2014 18:38
Show Gist options
  • Select an option

  • Save dduleone/51d3920b4e4dcecd6af0 to your computer and use it in GitHub Desktop.

Select an option

Save dduleone/51d3920b4e4dcecd6af0 to your computer and use it in GitHub Desktop.

Revisions

  1. dduleone created this gist Dec 4, 2014.
    26 changes: 26 additions & 0 deletions output.txt
    Original 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 />
    201 changes: 201 additions & 0 deletions pubsub.php
    Original 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;