php完成监听事件

2022 年 3 月 6 日1510

  本文介绍关于在php实现事件监听与触发实例程序代码,如何实现事件监听,参考了jQuery的事件绑定思路,简单的实现了一下。

  主要功能:

  1.绑定事件 支持一个事件绑定多个动作,支持绑定一次性事件

  2.触发事件

  3.注销事件

  代码如下:

  class Event

  {

   protected static $listens = array();

  

   public static function listen($event, $callback, $once=false){

   if(!is_callable($callback)) return false;

   self::$listens[$event][] = array('callback'=>$callback, 'once'=>$once);

   return true;

   }

  

   public static function one($event, $callback){

   return self::listen($event, $callback, true);

   }

  

   public static function remove($event, $index=null){

   if(is_null($index))

   unset(self::$listens[$event]);

   else

   unset(self::$listens[$event][$index]);

   }

  //Cuoxin.com

   public static function trigger(){

   if(!func_num_args()) return;

   $args = func_get_args();

   $event = array_shift($args);

   if(!isset(self::$listens[$event])) return false;

   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

  

  class Foo

  {

   public function bar(){

   echo "Foo::bar() is calledn";

   }

  

   public function test(){

   echo "Foo::foo() is called, agrs:".json_encode(func_get_args())."n";

   }

  }

  

  

  Event::listen('bar3', 'bar');

  Event::trigger('bar3');

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

0 0