用户名:
密 码: 记住
您当前的位置:首页 > 网络编程 > php教程

php实现事件监听与触发实例程序

时间:2015-01-23  来源:西部数据  作者:西部数据

闲来无事,想了想PHP如何实现事件监听,参考了jQuery的事件绑定思路,简单的实现了一下.

主要功能:1.绑定事件 支持一个事件绑定多个动作,支持绑定一次性事件,2.触发事件,3.注销事件

php实现事件监听与触发实例程序,代码如下:

  1. class Event  
  2. {  
  3.     protected static $listens       = array();  
  4.        
  5.     public static function listen($event$callback$once=false){  
  6.         if(!is_callable($callback)) return false;  
  7.         self::$listens[$event][]    = array('callback'=>$callback'once'=>$once);  
  8.         return true;  
  9.     }  
  10.        
  11.     public static function one($event$callback){  
  12.         return self::listen($event$callback, true);  
  13.     }  
  14.        
  15.     public static function remove($event$index=null){  
  16.         if(is_null($index))  
  17.             unset(self::$listens[$event]);  
  18.         else 
  19.             unset(self::$listens[$event][$index]);  
  20.     }  
  21.        
  22.     public static function trigger(){  
  23.         if(!func_num_args()) return;  
  24.         $args                       = func_get_args();  
  25.         $event                      = array_shift($args);  
  26.         if(!isset(self::$listens[$event])) return false;  
  27.         foreach((array) self::$listens[$eventas $index=>$listen){  
  28.             $callback               = $listen['callback'];  
  29.             $listen['once'] && self::remove($event$index);  
  30.             call_user_func_array($callback$args);  
  31.         }  
  32.     }  
  33. }
  34. 以下是一些调用的例子: 
  35. // 增加监听walk事件  
  36. Event::listen('walk'function(){  
  37.     echo "I am walking...n";  
  38. });  
  39. // 增加监听walk一次性事件  
  40. Event::listen('walk'function(){  
  41.     echo "I am listening...n";  
  42. }, true);  
  43. // 触发walk事件  
  44. Event::trigger('walk');  
  45. /*  
  46. I am walking...  
  47. I am listening...  
  48. */ 
  49. Event::trigger('walk');  
  50. /*  
  51. I am walking...  
  52. */ 
  53.    
  54. Event::one('say'function($name=''){  
  55.     echo "I am {$name}n";  
  56. });  
  57.    
  58. Event::trigger('say''deeka'); // 输出 I am deeka  
  59. Event::trigger('say''deeka'); // not run  
  60.    
  61. class Foo  
  62. {  
  63.     public function bar(){  
  64.         echo "Foo::bar() is calledn";  
  65.     }  
  66.        
  67.     public function test(){  
  68.         echo "Foo::foo() is called, agrs:".json_encode(func_get_args())."n";  
  69.     }  
  70. }  
  71.    
  72. $foo    = new Foo;  
  73.    
  74. Event::listen('bar'array($foo'bar'));  
  75. Event::trigger('bar');  
  76.    
  77. Event::listen('test'array($foo'test'));  
  78. Event::trigger('test', 1, 2, 3);  
  79.    
  80. class Bar  
  81. {  
  82.     public static function foo(){  
  83.         echo "Bar::foo() is calledn";  
  84.     }  
  85. }  
  86.    
  87. Event::listen('bar1'array('Bar''foo'));  
  88. Event::trigger('bar1');  
  89. //开源代码phpfensi.com 
  90. Event::listen('bar2''Bar::foo');  
  91. Event::trigger('bar2');  
  92.  
  93. function bar(){  
  94.     echo "bar() is calledn";  
  95. }  
  96.    
  97. Event::listen('bar3''bar');  
  98. Event::trigger('bar3'); 
来顶一下
返回首页
返回首页
推荐资讯
WiFi太不安全:7岁女孩11分钟内入侵公共网络 WiFi太不安全:7岁女孩11分钟内入侵近期刚刚发布研究说WiFi网络能获得人们手机里多少私人信息,
不服跑个分?人工智能也出现“刷分”乱象 不服跑个分?人工智能也出现“刷分2014年,人工智能领域突然爆发,成为了科研和科技创业的热门
相关文章
    无相关信息
栏目更新
栏目热门