看下面的事件类

class Event
{
protected static $listens = array(); /**
* [listen 注册监听事件]
* @param [string] $event [事件名]
* @param [callback] $callback [事件内容]
* @param [bool] $once [是否是一次性事件,默认false]
*/
public static function listen($event, $callback, $once=false){
if(!is_callable($callback)) return false;
self::$listens[$event][] = array('callback'=>$callback, 'once'=>$once);
return true;
} // 一次性事件
public static function one($event, $callback){
return self::listen($event, $callback, true);
} public static function remove($event, $index=null){
if(is_null($index))
unset(self::$listens[$event]);
else
unset(self::$listens[$event][$index]);
} public static function trigger(){
// 没有参数(传递事件) 退出
if(!func_num_args()) return;
// 事件名的数组
$args = func_get_args();
// 将函数名(callback)赋给 $event
$event = array_shift($args);
// 检测事件是否被注册过,没有则退出
if(!isset(self::$listens[$event])) return false;
foreach( self::$listens[$event] as $index=>$listen){
$callback = $listen['callback'];
$listen['once'] && self::remove($event, $index);
call_user_func_array($callback, $args);
}
}
}

这个类包含了事件的注册,触发及移除方法。

下面添加一个事件,事件名叫walk,事件的动作就是输出 "I am walking...n" ,执行后。该事件会存储在 $listens 这个数组中。

Event::listen('walk', function($a='',$b=''){
echo "I am walking...n" .$a .$b;
});

触发walk事件

Event::trigger('walk');

也可以传参数进去

Event::trigger('walk','~~~','!!!'); 

如果不移除该事件,触发一次就会执行一次。

而一次性事件执行过一次就会被销毁。再次调用没有任何反应。

Event::one('walkOnce', function(){
echo "run...once";
}); Event::trigger('walkOnce',true); // 因为已经执行过了,再次调用返回了false
Event::trigger('walkOnce');

最新文章

  1. C# 对 App.config的appSettings节点数据进行加密
  2. 权重和层叠规则决定了CSS样式优先级
  3. ESXi 强制4G内存解决(VMware ESXi 6.0.0.update02 )
  4. html5 css3中的一些笔记
  5. 安装CentOS7重启后提示License information
  6. Vim 常见操作
  7. Hibernate-清理一级缓存
  8. js之Function原型
  9. 网络环境场景以及模拟工具netem
  10. 金典 SQL笔记(4)
  11. EntityFramework Core解决并发详解
  12. Machine Learning|Andrew Ng|Coursera 吴恩达机器学习笔记
  13. P1113 杂务 拓扑排序
  14. 【C/C++】c文件重点总结
  15. linux php --ini
  16. ORM正向和反向查询
  17. java double 保留x位小数
  18. soap 简单的例子
  19. 数据库-IO系统性能之衡量性能的几个指标
  20. Linux查询系统信息命令

热门文章

  1. 死磕salt系列-salt配置文件
  2. Java并发案例01---多线程之死锁
  3. Hadoop学习之路(二十七)MapReduce的API使用(四)
  4. selenium + python自动化测试unittest框架学习(五)webdriver的二次封装
  5. 基于Azure Blob冷存储的数据压缩备份总结
  6. mark DOwm
  7. JNI由浅入深_3_Hello World
  8. CSU - 1581 Clock Pictures (KMP的变形题,难想到)
  9. 快速排序及STL中的sort算法
  10. css 尾巴