基于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中的MYSQL常用函数(php下操作数据库必备)
Sep 12 PHP
IP攻击升级,程序改进以对付新的攻击
Nov 23 PHP
php站内搜索并高亮显示关键字的实现代码
Dec 29 PHP
php fsockopen伪造post与get方法的详解
Jun 14 PHP
PHP中HTML标签过滤技巧
Jan 07 PHP
PHP计算指定日期所在周的开始和结束日期的方法
Mar 24 PHP
php计算给定时间之前的函数用法实例
Apr 03 PHP
PHP记录和读取JSON格式日志文件
Jul 07 PHP
thinkPHP框架对接支付宝即时到账接口回调操作示例
Nov 14 PHP
php生成毫秒时间戳的实例讲解
Sep 22 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
Feb 15 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
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
了解Joomla 这款来自国外的php网站管理系统
2010/03/11 PHP
让iframe框架网页在任何浏览器下自动伸缩
2006/08/18 Javascript
js中匿名函数的N种写法
2010/09/08 Javascript
editable.js 基于jquery的表格的编辑插件
2011/10/24 Javascript
无闪烁更新网页内容JS实现
2013/12/19 Javascript
js+canvas绘制矩形的方法
2016/01/28 Javascript
卸载安装Node.js与npm过程详解
2016/08/15 Javascript
详解Vue生命周期的示例
2017/03/10 Javascript
使用Node.js实现一个多人游戏服务器引擎
2019/03/13 Javascript
如何在wxml中直接写js代码(wxs)
2019/11/14 Javascript
谈谈node.js中的模块系统
2020/09/01 Javascript
[03:49]DOTA2英雄基础教程 光之守卫
2014/01/14 DOTA
Python中的对象,方法,类,实例,函数用法分析
2015/01/15 Python
Python json 错误xx is not JSON serializable解决办法
2017/03/15 Python
python中模块的__all__属性详解
2017/10/26 Python
Python中矩阵库Numpy基本操作详解
2017/11/21 Python
Django migrations 默认目录修改的方法教程
2018/09/28 Python
Django配置MySQL数据库的完整步骤
2019/09/07 Python
python如何从文件读取数据及解析
2019/09/19 Python
python socket通信编程实现文件上传代码实例
2019/12/14 Python
基于python+selenium的二次封装的实现
2020/01/06 Python
解决redis与Python交互取出来的是bytes类型的问题
2020/07/16 Python
python 深度学习中的4种激活函数
2020/09/18 Python
Python实现一个论文下载器的过程
2021/01/18 Python
解决margin 外边距合并问题
2019/07/03 HTML / CSS
意大利在线大学图书馆:Libreria universitaria
2019/07/16 全球购物
实习鉴定范文
2013/12/19 职场文书
红领巾心向党广播稿
2014/01/19 职场文书
教师演讲稿大全
2014/05/16 职场文书
化工专业求职信
2014/07/01 职场文书
公务员党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
2015年护士工作总结范文
2015/03/31 职场文书
环保守法证明
2015/06/24 职场文书
2016年校园植树节广播稿
2015/12/17 职场文书
离婚协议书范本(2016最新版)
2016/03/18 职场文书
职场中的你,辞职信写对了吗?
2019/06/26 职场文书