PHP 事件机制(2)

<div class="codetitle"><a style="CURSOR: pointer" data="70191" class="copybut" id="copybut70191" onclick="doCopy('code70191')"> 代码如下:

<div class="codebody" id="code70191">
<?PHP
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;
}
} abstract class Eventdispatcher{
private $_callback_method;
/
添加事件
@param Event $event
@param string $method
@param string||object $class
@return boolean true
/
public function attach($event,$method,$class=null){
$eventstr=(string)$event;
if($this->has($event,$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){
$event->target=$this;
$eventstr=(string)$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';
}else{
call_user_func(array($v['class'],$v['method']),$event);
}
}else{
$v'function';
}
}
}
}
/
删除事件
@param Event $event
@param string $method
@param string $class
@return boolean true
/
public function detact($event,$class=null){
$eventstr=(string)$event;
if(!$this->_check_callback($eventstr))
return true;
if(!$this->has($event,$method);
foreach ($this->_callback_method[$eventstr] as $k=>$v) {
if(($v==$this->_create_listener_method($eventstr,$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,$class=null){
$eventstr=(string)$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,
);
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(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($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,$method){
return array(
"object"=>true,
"class"=>$class,
);
}
} class myevent extends Event{
const aa='aaa';
}
class ball extends Eventdispatcher{
public function aa(){
$event=new myevent(myevent::aa);
$this->dispatch($event);
}
} class mytest {
public function test(){
$ball=new ball();
$ball->attach(myevent::aa,'kk');
$ball->aa();
}
public function kk($e){
print_r($e);
}
}
try{
$t=new mytest();
$t->test();
}catch (Exception $e){
echo $e->getmessage();
}

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...