时间:2021-07-01 10:21:17 帮助过:4人阅读
- <br><!--?php <BR-->class Event extends stdClass{ <br>public $target=null; <br>public $type=null; <br>/** <br>* 创建事件 <br>* @param string $type <br>*/ <br>public function __construct($type){ <br>$this->type=trim($type); <br>} <br>/** <br>* 得到事件字符串 <br>*/ <br>public function __toString(){ <br>return $this->type; <br>} <br>} <br><br>abstract class EventDispatcher{ <br>private $_callback_method; <br>/** <br>* 添加事件 <br>* @param Event $event <br>* @param string $method <br>* @param string||object $class <br>* @return boolean true <br>*/ <br>public function attach($event,$method,$class=null){ <br>$eventstr=(string)$event; <br>if($this->has($event,$method,$class)) <br>return true; <br>if($class!=null){ <br>$this->_check_method($class,$method); <br>$this->_callback_method[$eventstr][]=$this->_create_listener_method($eventstr,$class,$method); <br>}else{ <br>$this->_check_function($method); <br>$this->_callback_method[$eventstr][]=$this->_create_listener_fn($eventstr,$method); <br>} <br>return true; <br>} <br>/** <br>* 派发事件 <br>* @param Event $event <br>* @param string $method <br>* @param string||object $class <br>* @return void <br>*/ <br>public function dispatch(Event $event){ <br>$event->target=$this; <br>$eventstr=(string)$event; <br>if($this->_check_callback($eventstr)){ <br>foreach ($this->_callback_method[$eventstr] as $v){ <br>if($v['object']){ <br>if(is_object($v['class'])){ <br>$v['class']->$v['method']($event); <br>}else{ <br>call_user_func(array($v['class'], $v['method']),$event); <br>} <br>}else{ <br>$v['function']($event); <br>} <br>} <br>} <br>} <br>/** <br>* 删除事件 <br>* @param Event $event <br>* @param string $method <br>* @param string $class <br>* @return boolean true <br>*/ <br>public function detact($event,$method,$class=null){ <br>$eventstr=(string)$event; <br>if(!$this->_check_callback($eventstr)) <br>return true; <br>if(!$this->has($event,$method,$class)) <br>return true; <br>if($class!=null){ <br>$this->_check_method($class,$method); <br>foreach ($this->_callback_method[$eventstr] as $k=>$v) { <br>if(($v==$this->_create_listener_method($eventstr,$class,$method))){ <br>unset($this->_callback_method[$eventstr][$k]); <br>return true; <br>} <br>} <br>return true; <br>}else{ <br>$this->_check_function($method); <br>foreach ($this->_callback_method[$eventstr] as $k=>$v) { <br>if(($v==$this->_create_listener_fn($eventstr,$method))){ <br>unset($this->_callback_method[$eventstr][$k]); <br>return true; <br>} <br>} <br>return true; <br>} <br>} <br>/** <br>* 检测事件是否监听 <br>* @param Event $event <br>* @param string $method <br>* @param string $class <br>* @return boolean <br>*/ <br>public function has($event,$method,$class=null){ <br>$eventstr=(string)$event; <br>if(($class!=null)){ <br>$this->_check_method($class,$method); <br>if($this->_check_callback($eventstr)){ <br>foreach($this->_callback_method[$eventstr] as $v){ <br>if(is_object($v['class'])){ <br>$v_class=get_class($v['class']); <br>}else{ <br>$v_class=$v['class']; <br>} <br>if(is_object($class)){ <br>$s_class=get_class($class); <br>}else{ <br>$s_class=$class; <br>} <br>$temp_v=array( <br>"class"=>$v_class, <br>"method"=>$method, <br>); <br>$temp_s=array( <br>"class"=>$s_class, <br>"method"=>$method, <br>); <br>if($temp_v==$temp_s){ <br>return true; <br>} <br>} <br>} <br>}else{ <br>$this->_check_function($method); <br>if($this->_check_callback($eventstr)){ <br>foreach($this->_callback_method[$eventstr] as $v){ <br>if($method==$v['function']){ <br>return true; <br>} <br>} <br>} <br>} <br>return false; <br>} <br>/** <br>* 检测指定类是否存在指定方法 <br>* @param string $class <br>* @param string $method <br>* @exception Exception_Event <br>* @return void <br>*/ <br>private function _check_method($class,$method){ <br>if(!method_exists($class,$method)){ <br>throw new Exception(get_class($class)." not exist ".$method." method",1); <br>} <br>} <br>/** <br>* 检测指定函数是否存在 <br>* @param string $function <br>* @return void <br>*/ <br>private function _check_function($function){ <br>if(!function_exists($function)){ <br>throw new Exception($function." function not exist ",2); <br>} <br>} <br>/** <br>* 检测指定事件是否存在监听函数 <br>* @param string $eventstr <br>* @return boolean <br>*/ <br>private function _check_callback($eventstr){ <br>if(isset($this->_callback_method[$eventstr]) <br>&&is_array($this->_callback_method[$eventstr]) <br>){ <br>return true; <br>} <br>return false; <br>} <br>/** <br>* 创建监听函数数组 <br>* @param string $eventstr <br>* @param string $function <br>* @return array <br>*/ <br>private function _create_listener_fn($eventstr,$function){ <br>return array( <br>"object"=>false, <br>"function"=>$function, <br>); <br>} <br>/** <br>* 创建监听类数组 <br>* @param string $eventstr <br>* @param string $class <br>* @param string $method <br>* @return array <br>*/ <br>private function _create_listener_method($eventstr,$class,$method){ <br>return array( <br>"object"=>true, <br>"class"=>$class, <br>"method"=>$method, <br>); <br>} <br>} <br><br><br><br>class myevent extends Event{ <br>const aa='aaa'; <br>} <br>class ball extends EventDispatcher{ <br>public function aa(){ <br>$event=new myevent(myevent::aa); <br>$this->dispatch($event); <br>} <br>} <br><br>class mytest { <br>public function test(){ <br>$ball=new ball(); <br>$ball->attach(myevent::aa,'kk'); <br>$ball->aa(); <br>} <br>public function kk($e){ <br>print_r($e); <br>} <br>} <br><br><br>try{ <br>$t=new mytest(); <br>$t->test(); <br>}catch (Exception $e){ <br>echo $e->getmessage(); <br>}