仿AS3实现PHP 事件机制实现代码
2015-01-24信息快讯网
仿AS3实现PHP 事件机制实现代码,需要的朋友可以参考下。
<?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通过session id 实现session共享和登录验证的代码
php DOS攻击实现代码(附如何防范)
openflashchart 2.0 简单案例php版
PHP图片验证码制作实现分享(全)
php提示Call-time pass-by-reference has been deprecated in的解决方法[已测]
php实现rc4加密算法代码
php中邮箱地址正则表达式实现与详解
php 的加密函数 md5,crypt,base64_encode 等使用介绍
php addslashes及其他清除空格的方法是不安全的
php中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
PHP 事件机制(2)
使用XDebug调试及单元测试覆盖率分析
PHP 命名空间实例说明
PHP目录函数实现创建、读取目录教程实例
重新封装zend_soap实现http连接安全认证的php代码
Base64在线编码解码实现代码 演示与下载
php INI配置文件的解析实现分析
PHP strncasecmp字符串比较的小技巧
php simplexmlElement操作xml的命名空间实现代码
php下关于Cannot use a scalar value as an array的解决办法
在PHP中实现Javascript的escape()函数代码
破解图片防盗链的代码(asp/php)测试通过
北京警方通报优衣库不雅视频事件3人被拘留
广州中山大学北校区发生持刀劫持事件
光大乌龙指事件将于近日在沪宣判
黑龙江宾县发生疑似食物中毒事件致21人入院
“龙之梦电梯夹人”事件揭商场电梯保洁乱象