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


Posted in PHP onJune 18, 2015

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

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

<?php
/**
* 事件
*
* @author xiezhenye <xiezhenye@gmail.com>
* @since 2007-7-20
*/
class Event {
  private $callbacks = array();
  private $holder;
  function __construct() {
    $bt = debug_backtrace();
    if (count($bt) < 2) {
      $this->holder = null;
      return;
    }
    $this->holder = &$bt[1]['object'];
  }
  function attach() {
    $args = func_get_args();
    switch (count($args)) {
      case 1:
        if (is_callable($args[0])) {
          $this->callbacks[]= $args[0];
          return;
        }
        break;
      case 2:
        if (is_object($args[0]) && is_string($args[1])) {
          $this->callbacks[]= array(&$args[0], $args[1]);
        }
        return;
      default:
        return;
    }
  }
  function notify() {
    $bt = debug_backtrace();
    if ($this->holder && 
        ((count($bt) >= 2 && $bt[count($bt) - 1]['object'] !== $this->holder)
        || (count($bt) < 2))) {
      throw(new Exception('Notify can only be called in holder'));
    }
    foreach ($this->callbacks as $callback) {
      $args = func_get_args();
      call_user_func_array($callback, $args);
    }
  }
}

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
PHP使用者状态管理功能的应用
Oct 09 PHP
删除数组元素实用的PHP数组函数
Aug 18 PHP
php 过滤危险html代码
Jun 29 PHP
php学习笔记 数组的常用函数
Jun 13 PHP
PHP易混淆函数的区别及用法汇总
Nov 22 PHP
php通过array_merge()函数合并两个数组的方法
Mar 18 PHP
php支持中文字符串分割的函数
May 28 PHP
CodeIgniter针对lighttpd服务器URL重写的方法
Jun 10 PHP
PHP人民币金额转大写实例代码
Oct 02 PHP
PHP中ajax无刷新上传图片与图片下载功能
Feb 21 PHP
PHP将身份证正反面两张照片合成一张图片的代码
Apr 08 PHP
PHP基于mcript扩展实现对称加密功能示例
Feb 21 PHP
php使用MySQL保存session会话的方法
Jun 18 #PHP
php判断表是否存在的方法
Jun 18 #PHP
PHP实现HTTP断点续传的方法
Jun 17 #PHP
PHP实现在线阅读PDF文件的方法
Jun 17 #PHP
php源码分析之DZX1.5字符串截断函数cutstr用法
Jun 17 #PHP
php源码分析之DZX1.5加密解密函数authcode用法
Jun 17 #PHP
php源码分析之DZX1.5随机数函数random用法
Jun 17 #PHP
You might like
php简单静态页生成过程
2008/03/27 PHP
php PDO中文乱码解决办法
2009/07/20 PHP
PHP数组传递是值传递而非引用传递概念纠正
2013/01/31 PHP
基于php实现七牛抓取远程图片
2015/12/01 PHP
JavaScript 学习笔记(十六) js事件
2010/02/01 Javascript
完美解决IE低版本不支持call与apply的问题
2013/12/05 Javascript
JS实现的文字与图片定时切换效果代码
2015/10/06 Javascript
快速学习jQuery插件 Cookie插件使用方法
2015/12/01 Javascript
基于jquery实现最简单的选项卡切换效果
2016/05/08 Javascript
Node.js批量给图片加水印的方法
2016/11/15 Javascript
jQuery对table表格进行增删改查
2020/12/22 Javascript
JSON 数据格式详解
2017/09/13 Javascript
node.js用fs.rename强制重命名或移动文件夹的方法
2017/12/27 Javascript
Vuejs 2.0 子组件访问/调用父组件的方法(示例代码)
2018/02/08 Javascript
jQuery发请求传输中文参数乱码问题的解决方案
2018/05/22 jQuery
微信小程序ibeacon三点定位详解
2018/10/31 Javascript
vue使用Proxy实现双向绑定的方法示例
2019/03/20 Javascript
node中实现删除目录的几种方法
2019/06/24 Javascript
python赋值操作方法分享
2013/03/23 Python
python标准算法实现数组全排列的方法
2015/03/17 Python
如何准确判断请求是搜索引擎爬虫(蜘蛛)发出的请求
2015/10/13 Python
python开发之文件操作用法实例
2015/11/13 Python
Python字符串格式化输出方法分析
2016/04/13 Python
Python编程修改MP3文件名称的方法
2017/04/19 Python
python绘制双柱形图代码实例
2017/12/14 Python
Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例
2018/07/02 Python
Django之编辑时根据条件跳转回原页面的方法
2019/08/21 Python
selenium中get_cookies()和add_cookie()的用法详解
2020/01/06 Python
美国最大的团购网站:Groupon
2016/07/23 全球购物
幼教毕业生自我鉴定
2014/01/12 职场文书
护士辞职信范文
2014/01/19 职场文书
行政文员实习自我鉴定范文
2014/09/14 职场文书
施工安全员岗位职责
2015/04/11 职场文书
医院党建工作总结2015
2015/05/26 职场文书
政审证明范文
2015/06/19 职场文书
基于python定位棋子位置及识别棋子颜色
2021/07/26 Python