pubsub模式

<?php

$pubSuber = new pubSub;
$token = $pubSuber->subscribe('book', function() {
    var_dump(func_get_args());
    echo "I want to read book!";
});
$pubSuber->publish('book', "this is an string.");

$pubSuber->unsubscribe($token);

$pubSuber->publish('book', 'suxiaolin');

/**
 * 实现pubsub模式
 * 来自<<javascript设计模式>>
 * @author 苏小林
 * php>=5.3
 */
class pubSub {
    private static $topics = array();
    
    /**
     * 发布者
     * @param $topic string 发布的主题
     * @param $args mixed 发布的信息
     * @return object pubsub对象
     */
    public function publish($topic, $args) {
        if (!isset(self::$topics[$topic])) {
            return false;
        }
        
        $subscribes = self::$topics[$topic];
        $len = count($subscribes);
        while($len--) {
            $subscribes[$len]['func']($args);
        }
        
        return $this;
    }
    
    /**
     * 订阅者
     * @param $topic string 订阅的主题
     * @param $fn clouser 接收到发布者发布的信息后执行的动作
     * @return int 动作id
     */
    public function subscribe($topic, $fn) {
        if (!isset(self::$topics[$topic])) {
            self::$topics[$topic] = array();
        }
        
        $token = uniqid();
        $ev = array('func'=>$fn, 'token'=>$token);
        array_push(self::$topics[$topic],$ev);
        
        return $token;
    }
    
    /**
     * 删除指定订阅的指定动作
     * @param $token int 动作id
     * @return mixed 成功返回被删除的动作id,失败返回pubsub对象.
     */
    public function unsubscribe($token) {
        foreach(self::$topics as $k=>$topics) {
            foreach($topics as $key=>$topic) {
                if ($topic['token'] == $token) {
                    unset(self::$topics[$k][$key]);
                    return $token;
                }
            }
        }
        return $this;
    }
}
原文地址:https://www.cnblogs.com/mtima/p/3176455.html