• 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;
        }
    }
  • 相关阅读:
    URAL 1948 H
    int、long、long long取值范围
    Bonetrousle HackerRank 数学 + 思维题
    湖南省第十二届大学生计算机程序设计竞赛 problem A 2016
    Abbreviation ---- hackerrank
    POJ 3321 Apple Tree DFS序 + 树状数组
    HDU
    PICO CTF 2013 PHP 2: 85
    XSS进阶三
    XSS进阶二
  • 原文地址:https://www.cnblogs.com/mtima/p/3176455.html
Copyright © 2020-2023  润新知