仿AS3实现PHP 事件机制实现代码


Posted in PHP onJanuary 27, 2011
<?php 
/** 
* 事件异常 
* 
* @author lonely 
* @create 2010-10-21 
* @version 0.1 
* @lastupdate lonely 
* @package Event 
*/ 
class Exception_Event extends Exception {} 
/** 
* 事件对象 
* 
* @author lonely 
* @create 2010-10-21 
* @version 0.1 
* @lastupdate lonely 
* @package Event 
*/ 
class Event extends stdClass{ 
public $target=null; 
public $type=null; 
/** 
* 创建事件 
* @param string $type 
*/ 
public function __construct($type){ 
$this->type=trim($type); 
} 
/** 
* 得到事件字符串 
*/ 
public function __toString(){ 
return $this->type; 
} 
} 
/** 
* 事件派发 
* 
* @author lonely 
* @create 2010-10-21 
* @version 0.1 
* @lastupdate lonely 
* @package Event 
*/ 
class EventDispatcher{ 
private $_callback_method; 
/** 
* 添加事件 
* @param Event $event 
* @param string $method 
* @param string||object $class 
* @return boolean true 
*/ 
public function attach(Event $event,$method,$class=null){ 
$event->target=$this; 
$eventstr=$this->_create_event_str($event); 
if($this->has($event,$method,$class)) 
return true; 
if($class!=null){ 
$this->_check_method($class,$method); 
$this->_callback_method[$eventstr][]=$this->_create_listener_method($eventstr,$class,$method); 
}else{ 
$this->_check_function($method); 
$this->_callback_method[$eventstr][]=$this->_create_listener_fn($eventstr,$method); 
} 
return true; 
} 
/** 
* 派发事件 
* @param Event $event 
* @param string $method 
* @param string||object $class 
* @return void 
*/ 
public function dispatch(Event $event){ 
$eventstr=$this->_create_event_str($event); 
if($this->_check_callback($eventstr)){ 
foreach ($this->_callback_method[$eventstr] as $v){ 
if($v['object']){ 
if(is_object($v['class'])){ 
$v['class']->$v['method']($event); 
}else{ 
call_user_func(array($v['class'], $v['method']),$event); 
} 
}else{ 
$v['function']($event); 
} 
} 
} 
} 
/** 
* 删除事件 
* @param Event $event 
* @param string $method 
* @param string $class 
* @return boolean true 
*/ 
public function detact(Event $event,$method,$class=null){ 
$eventstr=$this->_create_event_str($event); 
if(!$this->_check_callback($eventstr)) 
return true; 
if(!$this->has($event,$method,$class)) 
return true; 
if($class!=null){ 
$this->_check_method($class,$method); 
foreach ($this->_callback_method[$eventstr] as $k=>$v) { 
if(($v==$this->_create_listener_method($eventstr,$class,$method))){ 
unset($this->_callback_method[$eventstr][$k]); 
return true; 
} 
} 
return true; 
}else{ 
$this->_check_function($method); 
foreach ($this->_callback_method[$eventstr] as $k=>$v) { 
if(($v==$this->_create_listener_fn($eventstr,$method))){ 
unset($this->_callback_method[$eventstr][$k]); 
return true; 
} 
} 
return true; 
} 
} 
/** 
* 检测事件是否监听 
* @param Event $event 
* @param string $method 
* @param string $class 
* @return boolean 
*/ 
public function has(Event $event,$method,$class=null){ 
$eventstr=$this->_create_event_str($event); 
if(($class!=null)){ 
$this->_check_method($class,$method); 
if($this->_check_callback($eventstr)){ 
foreach($this->_callback_method[$eventstr] as $v){ 
if(is_object($v['class'])){ 
$v_class=get_class($v['class']); 
}else{ 
$v_class=$v['class']; 
} 
if(is_object($class)){ 
$s_class=get_class($class); 
}else{ 
$s_class=$class; 
} 
$temp_v=array( 
"class"=>$v_class, 
"method"=>$method, 
); 
$temp_s=array( 
"class"=>$s_class, 
"method"=>$method, 
); 
if($temp_v==$temp_s){ 
return true; 
} 
} 
} 
}else{ 
$this->_check_function($method); 
if($this->_check_callback($eventstr)){ 
foreach($this->_callback_method[$eventstr] as $v){ 
if($method==$v['function']){ 
return true; 
} 
} 
} 
} 
return false; 
} 
/** 
* 检测指定类是否存在指定方法 
* @param string $class 
* @param string $method 
* @exception Exception_Event 
* @return void 
*/ 
private function _check_method($class,$method){ 
if(!method_exists($class,$method)){ 
throw new Exception_Event(get_class($class)." not exist ".$method." method",1); 
} 
} 
/** 
* 检测指定函数是否存在 
* @param string $function 
* @return void 
*/ 
private function _check_function($function){ 
if(!function_exists($function)){ 
throw new Exception_Event($function." function not exist ",2); 
} 
} 
/** 
* 检测指定事件是否存在监听函数 
* @param string $eventstr 
* @return boolean 
*/ 
private function _check_callback($eventstr){ 
if(isset($this->_callback_method[$eventstr]) 
&&is_array($this->_callback_method[$eventstr]) 
){ 
return true; 
} 
return false; 
} 
/** 
* 创建监听函数数组 
* @param string $eventstr 
* @param string $function 
* @return array 
*/ 
private function _create_listener_fn($eventstr,$function){ 
return array( 
"object"=>false, 
"function"=>$function, 
); 
} 
/** 
* 创建监听类数组 
* @param string $eventstr 
* @param string $class 
* @param string $method 
* @return array 
*/ 
private function _create_listener_method($eventstr,$class,$method){ 
return array( 
"object"=>true, 
"class"=>$class, 
"method"=>$method, 
); 
} 
/** 
* 创建事件字符串 
* @param Event $event 
* @return string 
*/ 
private function _create_event_str(Event $event){ 
$classstr=strtolower(get_class($event)); 
$eventstr=(string)$event; 
return $classstr.$eventstr; 
} 
} 
class test extends EventDispatcher{ } 
function t($e){ 
print_r($e->a); 
} 
$v=new test(); 
$e=new Event("test"); 
$v->attach($e,"t"); 
$v->detact($e,"t"); 
echo $v->has($e,"t"); 
$e->a="dd"; 
$v->dispatch($e);
PHP 相关文章推荐
PHP中$_SERVER的详细参数与说明
Jul 29 PHP
php Calender(日历)代码分享
Jan 03 PHP
利用中国天气预报接口实现简单天气预报
Jan 20 PHP
PHP管理依赖(dependency)关系工具 Composer 安装与使用
Aug 18 PHP
php中header设置常见文件类型的content-type
Jun 23 PHP
PHP错误Warning:mysql_query()解决方法
Oct 24 PHP
Zend Framework实现留言本分页功能(附demo源码下载)
Mar 22 PHP
PHP使用自定义方法实现数组合并示例
Jul 07 PHP
PHP不使用递归的无限级分类简单实例
Nov 05 PHP
php redis实现文章发布系统(用户投票系统)
Mar 04 PHP
Yii2框架控制器、路由、Url生成操作示例
May 27 PHP
php回调函数处理数组操作示例
Apr 13 PHP
PHP 命名空间实例说明
Jan 27 #PHP
PHP中利用substr_replace将指定两位置之间的字符替换为*号
Jan 27 #PHP
PHP Session_Regenerate_ID函数双释放内存破坏漏洞
Jan 27 #PHP
PHP中通过加号合并数组的一个简单方法分享
Jan 27 #PHP
PHP中删除变量时unset()和null的区别分析
Jan 27 #PHP
PHP企业级应用之常见缓存技术篇
Jan 27 #PHP
兼容性最强的PHP生成缩略图的函数代码(修改版)
Jan 18 #PHP
You might like
php+ajax实现文章自动保存的方法
2014/12/30 PHP
php导出生成word的方法
2015/12/25 PHP
php数据访问之增删改查操作
2016/05/09 PHP
PHP实现的字符串匹配算法示例【sunday算法】
2017/12/19 PHP
PHP生成腾讯云COS接口需要的请求签名
2018/05/20 PHP
PHP htmlspecialchars()函数用法与实例讲解
2019/03/08 PHP
提高代码性能技巧谈—以创建千行表格为例
2006/07/01 Javascript
获得所有表单值的JQuery实现代码[IE暂不支持]
2012/05/24 Javascript
jquery的ajax和getJson跨域获取json数据的实现方法
2014/02/04 Javascript
js实现网页倒计时、网站已运行时间功能的代码3例
2014/04/14 Javascript
Javascript基础教程之switch语句
2015/01/18 Javascript
深入分析jsonp协议原理
2015/09/26 Javascript
jQuery实现连续动画效果实例分析
2015/10/09 Javascript
原生JS实现旋转木马式图片轮播插件
2016/04/25 Javascript
老生常谈JavaScript 正则表达式语法
2016/08/20 Javascript
JavaScript中const、var和let区别浅析
2016/10/11 Javascript
js+css3制作时钟特效
2016/10/16 Javascript
浅谈vue实现数据监听的函数 Object.defineProperty
2017/06/08 Javascript
JavaScript数据类型和变量_动力节点Java学院整理
2017/06/26 Javascript
javascript基本常用排序算法解析
2017/09/27 Javascript
详解小程序用户登录状态检查与更新实例
2019/05/15 Javascript
TypeScript的安装、使用、自动编译的实现
2020/04/10 Javascript
理解Python中函数的参数
2015/04/27 Python
Python实现注册登录系统
2017/08/08 Python
解决pip install的时候报错timed out的问题
2018/06/12 Python
Python从ZabbixAPI获取信息及实现Zabbix-API 监控的方法
2018/09/17 Python
Python matplotlib画图时图例说明(legend)放到图像外侧详解
2020/05/16 Python
Python中如何引入第三方模块
2020/05/27 Python
python中os.remove()用法及注意事项
2021/01/31 Python
对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中
2015/06/22 面试题
一年级小学生评语
2014/04/22 职场文书
学校交通安全责任书
2014/08/25 职场文书
群众路线教师自我剖析材料
2014/09/29 职场文书
2015年教师节贺卡寄语
2015/03/24 职场文书
超搞笑婚前保证书
2015/05/08 职场文书
pytorch 实现多个Dataloader同时训练
2021/05/29 Python