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获得当前的脚本网址
Dec 10 PHP
ExtJS与PHP、MySQL实现存储的方法
Apr 02 PHP
PHP图片上传代码
Nov 04 PHP
php_screw安装使用教程(另一个PHP代码加密实现)
May 29 PHP
php操作redis中的hash和zset类型数据的方法和代码例子
Jul 05 PHP
Php-Redis安装测试笔记
Mar 05 PHP
php读取文件内容到数组的方法
Mar 16 PHP
php生成zip文件类实例
Apr 07 PHP
PHP Hash算法:Times33算法代码实例
May 13 PHP
php 数组字符串搜索array_search技巧
Jul 05 PHP
php实现文件预览功能
May 23 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
Mar 11 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 面向对象的一个例子
2011/04/12 PHP
用PHP生成excel文件到指定目录
2015/06/22 PHP
php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
2018/09/28 PHP
PHP实现微信小程序用户授权的工具类示例
2019/03/05 PHP
jquery实现图片等比例缩放以及max-width在ie中不兼容解决
2013/03/21 Javascript
抛弃Nginx使用nodejs做反向代理服务器
2014/07/17 NodeJs
ECMAScript5中的对象存取器属性:getter和setter介绍
2014/12/08 Javascript
js获取数组的最后一个元素
2015/04/14 Javascript
基于jquery编写分页插件
2016/03/07 Javascript
js中数组结合字符串实现查找(屏蔽广告判断url等)
2016/03/30 Javascript
Google 地图控件集详解及实例代码
2016/08/06 Javascript
JavaScript 中对象的深拷贝
2016/12/04 Javascript
配置nodejs环境的方法
2017/05/13 NodeJs
JS实现的按钮点击颜色切换功能示例
2017/10/19 Javascript
Vue仿今日头条实例详解
2018/02/06 Javascript
Python程序员开发中常犯的10个错误
2014/07/07 Python
Python实现读取目录所有文件的文件名并保存到txt文件代码
2014/11/22 Python
Python选课系统开发程序
2016/09/02 Python
Python实现判断字符串中包含某个字符的判断函数示例
2018/01/08 Python
python爬虫的数据库连接问题【推荐】
2018/06/25 Python
python中sys.argv函数精简概括
2018/07/08 Python
Python使用post及get方式提交数据的实例
2019/01/24 Python
python整合ffmpeg实现视频文件的批量转换
2019/05/31 Python
django多对多表的创建,级联删除及手动创建第三张表
2019/07/25 Python
基于Python和PyYAML读取yaml配置文件数据
2020/01/13 Python
树莓派4B安装Tensorflow的方法步骤
2020/07/16 Python
python小技巧——将变量保存在本地及读取
2020/11/13 Python
Python urllib request模块发送请求实现过程解析
2020/12/10 Python
应用电子专业学生的自我评价
2013/10/16 职场文书
个人自我鉴定写法
2013/11/30 职场文书
家居饰品店创业计划书
2014/01/31 职场文书
《我爱祖国》演讲稿1000字
2014/09/26 职场文书
学校开学标语
2014/10/06 职场文书
论文致谢词范文
2015/05/14 职场文书
陈斌强事迹观后感
2015/06/17 职场文书
python和anaconda的区别
2022/05/06 Python