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

基于PHP实现的事件机制实例分析

发布:smiling 来源: PHP粉丝网  添加日期:2021-05-28 21:27:13 浏览: 评论:0 

这篇文章主要介绍了基于PHP实现的事件机制,实例分析了事件机制的原理及php中debug_backtrace函数完成事件机制的实现技巧,需要的朋友可以参考下。

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

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

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

Tags: PHP事件机制

分享到:

相关文章