基于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 相关文章推荐
数字转英文
Dec 06 PHP
WindowsXP中快速配置Apache+PHP5+Mysql
Jun 05 PHP
一贴学会PHP 新手入门教程
Aug 03 PHP
谈谈新手如何学习PHP 默默经典版本
Aug 04 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
May 05 PHP
深入了解 register_globals (附register_globals=off 网站打不开的解决方法)
Jun 27 PHP
PHP笔记之:日期函数的使用介绍
Apr 24 PHP
php5.3提示Function ereg() is deprecated Error问题解决方法
Nov 12 PHP
PHP中配置IIS7实现基本身份验证的方法
Sep 24 PHP
PHP 数组基本操作小结(推荐)
Jun 13 PHP
postfixadmin忘记密码后的修改密码方法详解
Jul 20 PHP
PHP过滤器 filter_has_var() 函数用法实例分析
Apr 23 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
评分9.0以上的动画电影,剧情除了经典还很燃
2020/03/04 日漫
PHP数组及条件,循环语句学习
2012/11/11 PHP
PHP邮箱验证示例教程
2016/06/01 PHP
jQuery创建插件的代码分析
2011/04/14 Javascript
javaScript实现浮点数转十六进制字符
2013/10/29 Javascript
js实现幻灯片播放图片示例代码
2013/11/07 Javascript
jquery实现点击消失的代码
2014/03/03 Javascript
table insertRow、deleteRow定义和用法总结
2014/05/14 Javascript
原生JavaScript生成GUID的实现示例
2014/09/05 Javascript
javascript获取重复次数最多的字符
2015/07/08 Javascript
利用javascript如何随机生成一定位数的密码
2017/09/22 Javascript
JS实现关键词高亮显示正则匹配
2018/06/22 Javascript
详解关于Angular4 ng-zorro使用过程中遇到的问题
2018/12/05 Javascript
使用Node.js写一个代码生成器的方法步骤
2019/05/10 Javascript
JS三级联动代码格式实例详解
2019/12/30 Javascript
[06:16]DOTA2守卫传承者——职业选手谈心路历程
2015/02/26 DOTA
[59:36]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第二场
2018/04/04 DOTA
Python查询IP地址归属完整代码
2017/06/21 Python
使用Python进行AES加密和解密的示例代码
2018/02/02 Python
如何不用安装python就能在.NET里调用Python库
2019/07/12 Python
使用Pyinstaller转换.py文件为.exe可执行程序过程详解
2019/08/06 Python
如何用Python来理一理红楼梦里的那些关系
2019/08/14 Python
pandas数据处理进阶详解
2019/10/11 Python
Python文件路径名的操作方法
2019/10/30 Python
Python中os模块功能与用法详解
2020/02/26 Python
Python selenium文件上传下载功能代码实例
2020/04/13 Python
CSS3制作炫酷的自定义发光文字
2016/03/28 HTML / CSS
Burberry英国官网:英国标志性奢侈品牌
2017/03/29 全球购物
幼儿园教育教学反思
2014/01/31 职场文书
总经理岗位职责范本
2014/02/02 职场文书
《数星星的孩子》教学反思
2014/04/11 职场文书
服务承诺书格式
2014/05/21 职场文书
2014年学习全国道德模范事迹思想汇报
2014/09/15 职场文书
2014年综治维稳工作总结
2014/11/17 职场文书
辛亥革命观后感
2015/06/02 职场文书
Oracle锁表解决方法的详细记录
2022/06/05 Oracle