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;
}
}
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步