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

yipeiwu_com6年前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加密解密函数代码

复制代码 代码如下:<?phpfunction encode_pass($tex,$key,$type="encode",$expiry=0){   ...

利用PHP自动生成印有用户信息的名片

利用PHP自动生成印有用户信息的名片

前言 无论是自己要在精心P过的自拍上添加个性文字,或者是摄影爱好者要在拍摄的作品里添加水印,亦或是在网页或者移动应用中实时生成文字和图片的组合,我们都需要找到一个合适且靠谱的方法来将图片...

PHP模拟QQ登录的方法

本文实例讲述了PHP模拟QQ登录的方法。分享给大家供大家参考。具体实现方法如下: 原理是用curl模拟发送post登录,cookie保存本地 这样理论上可以支持永久单挂QQ <...

PHP基于闭包思想实现的BT(torrent)文件解析工具实例详解

本文实例讲述了PHP基于闭包思想实现的torrent文件解析工具。分享给大家供大家参考,具体如下: PHP对静态词法域的支持有点奇怪,内部匿名函数必须在参数列表后面加上use关键字,显式...

PHP使用glob函数遍历目录或文件夹的方法

本文实例讲述了PHP使用glob函数遍历目录或文件夹的方法。分享给大家供大家参考。具体分析如下: 一说到php遍历目录我们很多朋友会想到是opendir与readdir,这样就可以遍历目...