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 相关文章推荐
第一节--面向对象编程
Nov 16 PHP
php 正确解码javascript中通过escape编码后的字符
Jan 28 PHP
php stream_get_meta_data返回值
Sep 29 PHP
PHP处理Json字符串解码返回NULL的解决方法
Sep 01 PHP
Windows下Apache + PHP SESSION丢失的解决过程全纪录
Apr 07 PHP
简单了解WordPress开发中update_option()函数的用法
Jan 11 PHP
利用PHP抓取百度阅读的方法示例
Dec 18 PHP
Laravel学习教程之model validation的使用示例
Oct 23 PHP
php-fpm服务启动脚本的方法
Apr 27 PHP
PHP绕过open_basedir限制操作文件的方法
Jun 10 PHP
PDO::beginTransaction讲解
Jan 27 PHP
PHP Swoole异步Redis客户端实现方法示例
Oct 24 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/10/09 PHP
Node.js实战 建立简单的Web服务器
2012/03/08 Javascript
jquery放大镜效果超漂亮噢
2013/11/15 Javascript
Mac/Windows下如何安装Node.js
2013/11/22 Javascript
javascript数据类型示例分享
2015/01/19 Javascript
jquery滚动到顶部底部代码
2015/04/20 Javascript
AngularJS 避繁就简的路由
2016/07/01 Javascript
javascript中闭包概念与用法深入理解
2016/12/15 Javascript
Vue编写多地区选择组件
2017/08/21 Javascript
深入理解js 中async 函数的含义和用法
2018/05/13 Javascript
vue组件从开发到发布的实现步骤
2018/11/11 Javascript
javascript删除数组元素的七个方法示例
2019/09/09 Javascript
Vue 设置axios请求格式为form-data的操作步骤
2019/10/29 Javascript
JS指定音频audio在某个时间点进行播放
2020/11/28 Javascript
python 字符串只保留汉字的方法
2018/11/16 Python
python分布式编程实现过程解析
2019/11/08 Python
Python爬取爱奇艺电影信息代码实例
2019/11/26 Python
python 将dicom图片转换成jpg图片的实例
2020/01/13 Python
pycharm通过ssh连接远程服务器教程
2020/02/12 Python
Python内置方法和属性应用:反射和单例(推荐)
2020/06/19 Python
HTML5自定义属性的问题分析
2019/08/16 HTML / CSS
瑞典时尚耳机品牌:Urbanears
2017/07/26 全球购物
完美实现CSS垂直居中的11种方法
2021/03/27 HTML / CSS
物流仓管员岗位职责
2013/12/04 职场文书
会计专业大学生求职信范文
2014/01/28 职场文书
汽车队司机先进事迹材料
2014/02/01 职场文书
租房协议书怎么写
2014/04/10 职场文书
地球一小时宣传标语
2014/06/24 职场文书
小学教师师德整改措施
2014/09/29 职场文书
成绩报告单家长评语
2014/12/30 职场文书
写给领导的感谢信
2015/01/22 职场文书
2015年关爱留守儿童工作总结
2015/05/22 职场文书
小学语文教师研修日志
2015/11/13 职场文书
全家福照片寄语怎么写?
2019/04/02 职场文书
使用python创建股票的时间序列可视化分析
2022/03/03 Python
VUE使用draggable实现组件拖拽
2022/04/06 Vue.js