• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

仿AS3实现PHP 事件机制实现代码_php技巧

php 搞代码 4年前 (2022-01-26) 24次浏览 已收录 0个评论
 <BR><?php <BR>/** <BR>* 事件异常 <BR>* <BR>* @author lonely <BR>* @create 2010-10-21 <BR>* @version 0.1 <BR>* @lastupdate lonely <BR>* @package Event <BR>*/ <BR>class Exception_Event extends Exception {} <BR>/** <BR>* 事件对象 <BR>* <BR>* @author lonely <BR>* @create 2010-10-21 <BR>* @version 0.1 <BR>* @lastupdate lonely <BR>* @package Event <BR>*/ <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>* 事件派发 <BR>* <BR>* @author lonely <BR>* @create 2010-10-21 <BR>* @version 0.1 <BR>* @lastupdate lonely <BR>* @package Event <BR>*/ <BR>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 $event,$method,$class=null){ <BR>$event->target=$this; <BR>$eventstr=$this->_create_event_str($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>$eventstr=$this->_create_event_str($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 $event,$method,$class=null){ <BR>$eventstr=$this->_create_event_str($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 $event,$method,$class=null){ <BR>$eventstr=$this->_create_event_str($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>); <div style="color:transparent">本文来源gaodai.ma#com搞##代!^码@网*</div><pre>搞gaodaima代码


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);


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:仿AS3实现PHP 事件机制实现代码_php技巧
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址