<div class="codetitle"><a style="CURSOR: pointer" data="7915" class="copybut" id="copybut7915" onclick="doCopy('code7915')"> 代码如下:<div class="codebody" id="code7915"> <?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,$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'; }else{ call_user_func(array($v['class'],$v['method']),$event); } }else{ $v'function'; } } } } / 删除事件 @param Event $event @param string $method @param string $class @return boolean true / public function detact(Event $event,$class=null){ $eventstr=$this->_create_event_str($event); if(!$this->_check_callback($eventstr)) return true; if(!$this->has($event,$method); foreach ($this->_callback_method[$eventstr] as $k=>$v) { if(($v==$this->_create_listener_method($eventstr,$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,$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, ); 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,$method){ return array( "object"=>true, "class"=>$class, ); } /* 创建事件字符串 @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);
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|