当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP实现事件机制实例分析

发布:smiling 来源: PHP粉丝网  添加日期:2021-06-05 13:47:37 浏览: 评论:0 

本文实例讲述了PHP实现事件机制的方法,分享给大家供大家参考,具体分析如下:

内置了事件机制的语言不多,php也没有提供这样的功能。事件(Event)说简单了就是一个Observer模式,实现起来很容易,但是有所不同的是,事件的监听者谁都可以加,但是只能由直接包含它的对象触发,这就有一点点难度了,php有一个debug_backtrace函数,可以得到当前的调用栈,由此可以找到判断调用事件触发函数的对象是不是直接包含它的对象的办法。

  1. <?php 
  2. /** 
  3. * 事件 
  4. * 
  5. * @author xiezhenye <xiezhenye@gmail.com> 
  6. */ 
  7. class Event { 
  8.   private $callbacks = array(); 
  9.   private $holder
  10.   function __construct() { 
  11.     $bt = debug_backtrace(); 
  12.     if (count($bt) < 2) { 
  13.       $this->holder = null; 
  14.       return
  15.     } 
  16.     $this->holder = &$bt[1]['object']; 
  17.   } 
  18.   function attach() { 
  19.     $args = func_get_args(); 
  20.     switch (count($args)) { 
  21.       case 1: 
  22.         if (is_callable($args[0])) { 
  23.           $this->callbacks[]= $args[0]; 
  24.           return
  25.         } 
  26.         break
  27.       case 2: 
  28.         if (is_object($args[0]) && is_string($args[1])) { 
  29.           $this->callbacks[]= array(&$args[0], $args[1]); 
  30.         } 
  31.         return
  32.       default
  33.         return
  34.     } 
  35.   } 
  36.   function notify() { 
  37.     $bt = debug_backtrace(); 
  38.     if ($this->holder &&  
  39.         ((count($bt) >= 2 && $bt[count($bt) - 1]['object'] !== $this->holder) 
  40.         || (count($bt) < 2))) { 
  41.       throw(new Exception('Notify can only be called in holder')); 
  42.     } 
  43.     foreach ($this->callbacks as $callback) { 
  44.       $args = func_get_args(); 
  45.       call_user_func_array($callback$args); 
  46.     } 
  47.   } 
  48. }

Tags: PHP事件机制

分享到: