基于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数学运算
Dec 30 PHP
PHP版网站缓存加快打开速度的方法分享
Jun 03 PHP
shell脚本作为保证PHP脚本不挂掉的守护进程实例分享
Jul 15 PHP
php备份数据库类分享
Apr 14 PHP
php将字符串随机分割成不同长度数组的方法
Jun 01 PHP
基于php的CMS中展示文章类实例分析
Jun 18 PHP
微信公众平台开发之天气预报功能
Aug 31 PHP
[原创]ThinkPHP让../Public在模板不解析(直接输出)的方法
Oct 09 PHP
php提交过来的数据生成为txt文件
Apr 28 PHP
thinkPHP自动验证、自动添加及表单错误问题分析
Oct 17 PHP
Laravel框架学习笔记之批量更新数据功能
May 30 PHP
php中的buffer缓冲区用法分析
May 31 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环境套包 dedeampz 伪静态设置示例
2014/03/26 PHP
基于逻辑运算的简单权限系统(实现) JS 版
2007/03/24 Javascript
JavaScript中“过于”犀利地for/in循环使用示例
2013/10/22 Javascript
jquery中ajax使用error调试错误的方法
2015/02/08 Javascript
JQuery插件Quicksand实现超炫的动画洗牌效果
2015/05/03 Javascript
jQuery Ajax 实例代码 ($.ajax、$.post、$.get)
2016/04/29 Javascript
jQuery操作json常用方法示例
2017/01/04 Javascript
微信小程序实现倒计时60s获取验证码
2020/04/17 Javascript
jQuery实现全选、反选和不选功能
2017/08/16 jQuery
浅析Javascript中双等号(==)隐性转换机制
2017/10/27 Javascript
详解ajax的data参数错误导致页面崩溃
2018/04/30 Javascript
通过实例解析js简易模块加载器
2019/06/17 Javascript
vue中的mescroll搜索运用及各种填坑处理
2019/10/30 Javascript
vue 解决路由只变化参数页面组件不更新问题
2019/11/05 Javascript
使用Vue.set()方法实现响应式修改数组数据步骤
2019/11/09 Javascript
JavaScript自定义超时API代码实例
2020/04/30 Javascript
跟老齐学Python之私有函数和专有方法
2014/10/24 Python
python字符串的方法与操作大全
2018/01/30 Python
解决Django数据库makemigrations有变化但是migrate时未变动问题
2018/05/30 Python
浅析python的优势和不足之处
2018/11/20 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
2018/11/30 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
2019/08/13 Python
Python with关键字,上下文管理器,@contextmanager文件操作示例
2019/10/17 Python
Python搭建代理IP池实现接口设置与整体调度
2019/10/27 Python
解决jupyter notebook 出现In[*]的问题
2020/04/13 Python
QML用PathView实现轮播图
2020/06/03 Python
python处理写入数据代码讲解
2020/10/22 Python
Python远程linux执行命令实现
2020/11/11 Python
html5使用canvas压缩图片的示例代码
2018/09/11 HTML / CSS
美国紧身牛仔裤品牌:NYDJ
2017/05/24 全球购物
医生自荐信
2013/10/11 职场文书
六一节目主持词
2014/04/01 职场文书
金融事务专业求职信
2014/04/25 职场文书
普通党员个人剖析材料
2014/10/08 职场文书
解决Golang中ResponseWriter的一个坑
2021/04/27 Golang
python机器学习实现oneR算法(以鸢尾data为例)
2022/03/03 Python