服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服务器之家 - 编程语言 - PHP教程 - 仿AS3实现PHP 事件机制实现代码

仿AS3实现PHP 事件机制实现代码

2019-11-16 13:51php教程网 PHP教程

仿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教程《PHP编程最快明白》第八讲:php启发和小结

    《PHP编程最快明白》第八讲:php启发和小结

    过前面的学习,大家必须把每一行代码都弄懂,我所提供的函数都是必须掌握的。 ...

    PHP编程网1412019-11-11
  • PHP教程PHP设计模式之注册树模式分析

    PHP设计模式之注册树模式分析

    这篇文章主要介绍了PHP设计模式之注册树模式,结合实例形式详细分析了注册树模式的概念、原理、实现方法与相关注意事项,需要的朋友可以参考下 ...

    笑笑别人2082019-10-24
  • PHP教程yii2 上传图片的示例代码

    yii2 上传图片的示例代码

    这篇文章主要介绍了yii2 上传图片的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    okokad3522019-08-30
  • PHP教程PHP 获取视频时长的实例代码

    PHP 获取视频时长的实例代码

    本文通过实例代码给大家介绍了php获取视频时长的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧 ...

    清风带酒2532019-09-20
  • PHP教程laravel中的一些简单实用功能

    laravel中的一些简单实用功能

    这篇文章主要给大家介绍了关于laravel中一些简单实用功能的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值...

    gaoziyuecj4402019-08-30
  • PHP教程PHP PDOStatement::columnCount讲解

    PHP PDOStatement::columnCount讲解

    今天小编就为大家分享一篇关于PHP PDOStatement::columnCount讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来...

    php参考手册3732019-06-25
  • PHP教程详解Laravel5.6 Passport实现Api接口认证

    详解Laravel5.6 Passport实现Api接口认证

    这篇文章主要介绍了详解Laravel5.6 Passport实现Api接口认证,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...

    chenly09111862019-09-17
  • PHP教程基于swoole实现多人聊天室

    基于swoole实现多人聊天室

    这篇文章主要为大家详细介绍了基于swoole实现多人聊天室,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 ...

    feiwutudou1692019-09-25