PHP 事件机制(2)


Posted in PHP onMarch 23, 2011
<?php 
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; 
} 
} abstract class EventDispatcher{ 
private $_callback_method; 
/** 
* 添加事件 
* @param Event $event 
* @param string $method 
* @param string||object $class 
* @return boolean true 
*/ 
public function attach($event,$method,$class=null){ 
$eventstr=(string)$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){ 
$event->target=$this; 
$eventstr=(string)$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,$method,$class=null){ 
$eventstr=(string)$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,$method,$class=null){ 
$eventstr=(string)$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(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($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, 
); 
} 
} 

class myevent extends Event{ 
const aa='aaa'; 
} 
class ball extends EventDispatcher{ 
public function aa(){ 
$event=new myevent(myevent::aa); 
$this->dispatch($event); 
} 
} 
class mytest { 
public function test(){ 
$ball=new ball(); 
$ball->attach(myevent::aa,'kk'); 
$ball->aa(); 
} 
public function kk($e){ 
print_r($e); 
} 
} 

try{ 
$t=new mytest(); 
$t->test(); 
}catch (Exception $e){ 
echo $e->getmessage(); 
}
PHP 相关文章推荐
PHP 超链接 抓取实现代码
Jun 29 PHP
php 遍历数据表数据并列表横向排列的代码
Sep 05 PHP
php判断手机访问还是电脑访问示例分享
Jan 20 PHP
PHP创建桌面快捷方式的实例代码
Feb 17 PHP
PHP中exec函数和shell_exec函数的区别
Aug 20 PHP
php在数组中查找指定值的方法
Mar 17 PHP
PHP实现简单实用的验证码类
Jul 29 PHP
PHP的APC模块实现上传进度条
Oct 27 PHP
Laravel5权限管理方法详解
Jul 26 PHP
PHP实现git部署的方法教程
Dec 19 PHP
thinkphp5框架API token身份验证功能示例
May 21 PHP
php使用redis的有序集合zset实现延迟队列应用示例
Feb 20 PHP
php函数之子字符串替换&amp;#65279; str_replace
Mar 23 #PHP
php expects parameter 1 to be resource, array given 错误
Mar 23 #PHP
php去掉字符串的最后一个字符附substr()的用法
Mar 23 #PHP
PHPUnit PHP测试框架安装方法
Mar 23 #PHP
开启CURL扩展,让服务器支持PHP curl函数(远程采集)
Mar 19 #PHP
windows下开发并编译PHP扩展的方法
Mar 18 #PHP
WordPress判断用户是否登录的代码
Mar 17 #PHP
You might like
缓存技术详谈―php
2006/12/14 PHP
php 用checkbox一次性删除多条记录的方法
2010/02/23 PHP
php设计模式之命令模式使用示例
2014/03/02 PHP
PHP数组生成XML格式数据的封装类实例
2016/11/10 PHP
php实现构建排除当前元素的乘积数组方法
2018/10/06 PHP
PHP设计模式之PHP迭代器模式讲解
2019/03/22 PHP
document.getElementById的简写方式(获取id对象的简略写法)
2010/09/10 Javascript
js 自制滚动条的小例子
2013/03/16 Javascript
JS字符串处理实例代码
2013/08/05 Javascript
取得元素的左和上偏移量的方法
2014/09/17 Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
2014/12/08 Javascript
js与jquery回车提交的方法
2015/02/03 Javascript
jQuery插件EnPlaceholder实现输入框提示文字
2015/06/05 Javascript
AngularJs定制样式插入到ueditor中的问题小结
2016/08/01 Javascript
基于MVC+EasyUI的web开发框架之使用云打印控件C-Lodop打印页面或套打报关运单信息
2016/08/29 Javascript
Centos7 中安装 Node.js v4.4.4
2016/11/03 Javascript
微信小程序 本地存储及登录页面处理实例详解
2017/01/11 Javascript
AngularJS select加载数据选中默认值的方法
2018/02/28 Javascript
基于vue实现图片验证码倒计时60s功能
2019/12/10 Javascript
ant design pro中可控的筛选和排序实例
2020/11/17 Javascript
[02:19]DOTA2上海特级锦标赛 观赛指南 Spectator Guide
2016/02/04 DOTA
Python实现SMTP发送邮件详细教程
2021/03/02 Python
Python3实现的字典、列表和json对象互转功能示例
2018/05/22 Python
python 定义给定初值或长度的list方法
2018/06/23 Python
Python 实现异步调用函数的示例讲解
2018/10/14 Python
python TF-IDF算法实现文本关键词提取
2019/05/29 Python
python中栈的原理及实现方法示例
2019/11/27 Python
VSCode配合pipenv搞定虚拟环境的实现方法
2020/05/17 Python
历史学专业毕业生求职信
2013/09/27 职场文书
大学生演讲稿范文
2014/01/11 职场文书
个人现实表现材料
2014/02/04 职场文书
行政专员的岗位职责
2014/03/10 职场文书
《彩色世界》教学反思
2014/04/12 职场文书
参赛口号
2014/06/16 职场文书
2015年妇产科工作总结
2015/05/18 职场文书
css3实现背景图片颜色修改的多种方式
2021/04/13 HTML / CSS