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"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大神交流添加微信,拉你入群

如果你想获得精品资料添加微信,送你资源

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190115A0ZRIM00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券