国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

php實現事件監聽與觸發實例程序

2024-05-04 21:48:26
字體:
來源:轉載
供稿:網友

閑來無事,想了想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. //開源代碼Vevb.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'); 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 桐梓县| 九龙坡区| 桃园县| 大兴区| 金坛市| 宜兴市| 沙田区| 于田县| 长顺县| 延庆县| 邳州市| 登封市| 禹州市| 喜德县| 汤阴县| 宜昌市| 福鼎市| 枞阳县| 大渡口区| 科技| 都安| 调兵山市| 鄂伦春自治旗| 韶关市| 湘潭市| 梨树县| 饶平县| 西青区| 安溪县| 通山县| 娱乐| 赣榆县| 临清市| 庆安县| 姜堰市| 宽甸| 喜德县| 镶黄旗| 西林县| 明溪县| 冕宁县|