最近跟踪yii源码 里面涉及到了绑定事件行为之类,于是自己手写了一个最简单的事件绑定实现


classEventHandle{privatestatic$_map=array();//类似jquery绑定事件publicfunctionon($name,$callback){if(!is_callable($callback))returnfalse;if(!isset(self::$_map[$name])){self::$_map[$name]=array();}self::$_map[$name][]=$callback;}//触发事件publicfunctiontrigger($name,$event){if(!isset(self::$_map[$name]))returnfalse;$function_arr=self::$_map[$name];foreach($function_arras$function){call_user_func($function,$event);}returntrue;}//移除某个事件特定的回调函数publicfunctionremove($name,$callback){if(!isset(self::$_map[$name]))returnfalse;$map=self::$_map[$name];$pos=array_search($callback,$map,true);if($pos>=0){array_splice($map,$pos,1);self::$_map[$name]=$map;}returntrue;}}//事件对象classEvent{publicstatic$options=array();publicfunction__construct($options=array()){$this->options=$options;}}//通过函数当回调函数functionstart1($event){echo'start1asdaa<br>';var_dump($event);}//通过类的方法当回调函数classEventCallback{publicfunctionstart3($event){echo'start3<br>';}}$eventhandle=newEventHandle();$eventhandle->on('start',"start1");$eventhandle->on('start',array("EventCallback","start3"));$eventhandle->remove('start',array("EventCallback","start3"));$eventhandle->trigger('start',newEvent(array('name'=>'hhhh','age'=>25)));


出现的结果如下:

start1asdaaobject(Event)[2]public'options'=>array(size=2)'name'=>string'hhhh'(length=4)'age'=>int25