PHP如何实现事件监听,参考了jQuery的事件绑定思路,简单的实现了一下。
主要功能:
1.绑定事件 支持一个事件绑定多个动作,支持绑定一次性事件
2.触发事件
3.注销事件
classEvent
{
protectedstatic$listens =array();
publicstaticfunctionlisten($event, $callback, $once=false){
if(!is_callable($callback))returnfalse;
self::$listens[$event][] =array('callback'=>$callback,'once'=>$once);
returntrue;
}
publicstaticfunctionone($event, $callback){
returnself::listen($event, $callback,true);
}
publicstaticfunctionremove($event, $index=null){
if(is_null($index))
unset(self::$listens[$event]);
else
unset(self::$listens[$event][$index]);
}
publicstaticfunctiontrigger(){
if(!func_num_args())return;
$args = func_get_args();
$event = array_shift($args);
if(!isset(self::$listens[$event]))
returnfalse;
foreach((array)self::$listens[$event]as$index=>$listen){
$callback = $listen['callback'];
$listen['once'] &&self::remove($event, $index);
call_user_func_array($callback, $args);
}
}
}
以下是一些调用的例子:
// 增加监听walk事件
Event::listen('walk',function(){
echo"I am walking...n";
});
// 增加监听walk一次性事件
Event::listen('walk',function(){
echo"I am listening...n";
},true);
// 触发walk事件
Event::trigger('walk');
/*
I am walking...
I am listening...
*/
Event::trigger('walk');
/*
I am walking...
*/
Event::one('say',function($name=''){
echo"I am {$name}n";
});
Event::trigger('say','deeka');// 输出 I am deeka
Event::trigger('say','deeka');// not run
classFoo
{
publicfunctionbar(){
echo"Foo::bar() is calledn";
}
publicfunctiontest(){
echo"Foo::foo() is called, agrs:".json_encode(func_get_args())."n";
}
}
$foo =newFoo;
Event::listen('bar',array($foo,'bar'));
Event::trigger('bar');
Event::listen('test',array($foo,'test'));
Event::trigger('test',1,2,3);
classBar
{
publicstaticfunctionfoo(){
echo"Bar::foo() is calledn";
}
}
Event::listen('bar1',array('Bar','foo'));
Event::trigger('bar1');
Event::listen('bar2','Bar::foo');
Event::trigger('bar2');
functionbar(){
echo"bar() is calledn";
}
Event::listen('bar3','bar');
Event::trigger('bar3');
以上内容希望帮助到大家,有需要的可以添加下方二维码进群交流学习新技术。
如果你想和PHP大神交流添加微信,拉你入群
如果你想获得精品资料添加微信,送你资源
领取专属 10元无门槛券
私享最新 技术干货