PHP中自定义事件驱动,处理机制。

原文:https://www.cnblogs.com/mafeifan/p/4322271.html

--------------------------------

PHP中的事件处理

 

看下面的事件类

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. Windows XP SP3下编译安装check-0.10.0
  2. ZZUOJ1196: 单调数
  3. NSNotificationCenter应用总结
  4. 利用ant脚本 自动构建svn增量/全量 系统程序升级包
  5. c++ 职责链模式(Chain of Responsibility)
  6. Spring 3.x jar 包详解 与 依赖关系(转)
  7. 省市区三级联动(二)JS部分简单版
  8. NT内存
  9. 使用DOM4J解析XMl文件与读取XML文件
  10. angular 指令 要点解析
  11. (转)FFMPEG解码流程
  12. XAF-列表视图编辑模式
  13. Android手势识别总结
  14. iphone与安卓的兼容性问题汇总
  15. oracle字段由中文前缀加数字,数字自动增长的实现
  16. JavaSE-反射-获取类或者对象的四种方法
  17. 推荐免费小巧图片大小处理工具--Image Resizer for Windows
  18. Topshelf:一款非常好用的 Windows 服务开发框架
  19. kettle中文乱码问题
  20. Linux 源码安装 Python3

热门文章

  1. vue小荔枝,时间控件,动态按月份增减。
  2. 出现Unrecognized field "state" (class com.jt.manage.pojo.ItemCat)异常
  3. 【PHPExcel实例】 php 导出 excel 实例
  4. 17-7-24-react入门
  5. CodeForces 731E Funny Game
  6. java.lang.ClassCastException: xut.bookshop.entity.User_$$_javassist_3 cannot be cast to javassist.util.proxy.Proxy
  7. go chapter 7 - 类型
  8. TarjanLCA学习笔记
  9. php elasticsearch 关键词搜索配置
  10. mysql交叉表查询解决方案整理