classEvent {protected$_handler=array();//事件处理器列表,是一个key=>value的数组,其中,key是字符串,表示事件名,value是数组,保存了响应事件的函数句柄/**
* 添加一个事件处理器
* 如果已经添加过了,就不重复添加了
*
* @param string 要响应的事件名
* @param string 函数名
* @param Object / string / null 作用域,也就是对象,如果为空,则表示全局作用域,如果为字符串,则表示指定的是类名,可以指定静态方法*/publicfunctionaddEventListener($evtName,$handler,$scope=null)
{$item=$this->_getListener($evtName,$handler,$scope);if(is_null($item) )
{$item=array();$item['handler']=$handler;$item['scope']=$scope;$this->_handler[$evtName][]=$item;
}else{echo'listener ignore';
}
}/**
* 删除一个事件处理器
*
* @param string 要响应的事件名
* @param string 函数名
* @param Object / string / null 作用域,也就是对象,如果为空,则表示全局作用域,如果为字符串,则表示指定的是类名,可以指定静态方法*/publicfunctionremoveEventListener($evtName,$handler,$scope=null)
{$item=$this->_getListener($evtName,$handler,$scope,true);
}/**
* 触发函数事件
*
* @param string $evtName 事件名
* @param Array $params 调用时的参数*/publicfunctionfire($evtName,$params=null)
{if(is_array($this->_handler[$evtName] ) )
{foreach($this->_handler[$evtName]as$item)
{if(is_null($item['scope'] ) )
{//全局作用域call_user_func_array($item['handler'],$params);
}elseif(is_string($item['scope'] ))
{//类上的静态调用call_user_func_array(array($item['scope'],$item['handler'] ),$params);
}else{//在scope上调用$strParams='';$strCode='$myobj->$fnName(';for($i=0;$i
{$strParams.=('$params['.$i.']');if($i!=count($params)-1)
{$strParams.=',';
}
}$strCode=$strCode.$strParams.");";$anonymous=create_function('$fnName , $myobj , $params',$strCode);$anonymous($item['handler'],$item['scope'],$params);
}
}
}
}/**
* 获取一个监听者
*
* @param string $evtName
* @param string $handler
* @param mixed $scope
* @param bool $isDelete //获取监听者以后是否删除这个监听者,默认为false
* @return Array / null*/privatefunction_getListener($evtName,$handler,$scope,$isDelete=false)
{$ret=null;if(is_array($this->_handler[$evtName] ) )
{foreach($this->_handler[$evtName]as$key=>$listeners)
{if($listeners['handler']==$handler&&$listeners['scope']==$scope)
{$ret=$listeners;if($isDelete==true)
{unset($this->_handler[$evtName][$key] );
}break;
}
}if(count($this->_handler[$evtName])==0)
{unset($this->_handler[$evtName] );
}
}return$ret;
}
}