php实现事件监听与触发的方法
本文实例讲述了php实现事件监听与触发的方法。分享给大家供大家参考。具体分析如下:
闲来无事,想了想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"Iamwalking...n";
});
//增加监听walk一次性事件
Event::listen('walk',function(){
echo"Iamlistening...n";
},true);
//触发walk事件
Event::trigger('walk');
/*
Iamwalking...
Iamlistening...
*/
Event::trigger('walk');
/*
Iamwalking...
*/
Event::one('say',function($name=''){
echo"Iam{$name}n";
});
Event::trigger('say','deeka');//输出Iamdeeka
Event::trigger('say','deeka');//notrun
classFoo
{
publicfunctionbar(){
echo"Foo::bar()iscalledn";
}
publicfunctiontest(){
echo"Foo::foo()iscalled,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()iscalledn";
}
}
Event::listen('bar1',array('Bar','foo'));
Event::trigger('bar1');
Event::listen('bar2','Bar::foo');
Event::trigger('bar2');
functionbar(){
echo"bar()iscalledn";
}
Event::listen('bar3','bar');
Event::trigger('bar3');
希望本文所述对大家的PHP程序设计有所帮助。