基于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 相关文章推荐
为php4加入动态flash文件的生成的支持
Oct 09 PHP
mysql 搜索之简单应用
Apr 27 PHP
PHP 数字左侧自动补0
Mar 31 PHP
php输出1000以内质数(素数)示例
Feb 16 PHP
php获取URL中带#号等特殊符号参数的解决方法
Sep 02 PHP
为PHP5.4开启Zend OPCode缓存
Dec 26 PHP
PHP批量查询WordPress留言者E-mail地址实现方法
Feb 15 PHP
你应该知道PHP浮点数知识
May 13 PHP
php正则表达式学习笔记
Nov 13 PHP
PHP实现批量检测网站是否能够正常打开的方法
Aug 23 PHP
PHP foreach遍历多维数组实现方式
Nov 16 PHP
PHP基于IMAP收取邮件的方法示例
Aug 07 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 include和require的区别深入解析
2013/06/17 PHP
PHP 与 UTF-8 的最佳实践详细介绍
2017/01/04 PHP
JavaScript中的History历史对象
2008/01/16 Javascript
Firefox下提示illegal character并出现乱码的原因
2010/03/25 Javascript
从零开始学习jQuery (十) jQueryUI常用功能实战
2011/02/23 Javascript
SeaJS入门教程系列之使用SeaJS(二)
2014/03/03 Javascript
jquery实现简单的二级导航下拉菜单效果
2015/09/07 Javascript
D3.js封装文本实现自动换行和旋转平移等功能
2016/10/14 Javascript
Angular2库初探
2017/03/01 Javascript
Jquery中attr与prop的区别详解
2017/05/27 jQuery
详解angular中的作用域及继承
2017/05/31 Javascript
Node.js实现发送邮件功能
2017/11/06 Javascript
VUE2.0 ElementUI2.0表格el-table自适应高度的实现方法
2018/11/28 Javascript
JS实现图片拖拽交换效果
2018/11/30 Javascript
Vue2.0 实现页面缓存和不缓存的方式
2019/11/12 Javascript
vue+elementUI实现简单日历功能
2020/09/24 Javascript
浅谈Python中的数据类型
2015/05/05 Python
Python实现遍历目录的方法【测试可用】
2017/03/22 Python
Python3之文件读写操作的实例讲解
2018/01/23 Python
python中正则表达式的使用方法
2018/02/25 Python
python通过zabbix api获取主机
2018/09/17 Python
PyTorch搭建一维线性回归模型(二)
2019/05/22 Python
python 实现在tkinter中动态显示label图片的方法
2019/06/13 Python
python3.7通过thrift操作hbase的示例代码
2020/01/14 Python
python实现tail -f 功能
2020/01/17 Python
django 多数据库及分库实现方式
2020/04/01 Python
python打开音乐文件的实例方法
2020/07/21 Python
细说CSS3中的选择符
2008/10/17 HTML / CSS
荷兰鞋子在线:Nelson Schoenen
2017/12/25 全球购物
Cotton On南非:澳洲时尚平价品牌
2018/06/28 全球购物
西安交大自主招生自荐信
2014/01/27 职场文书
市场开发与营销专业求职信范文
2014/05/01 职场文书
建筑结构施工求职信
2014/07/11 职场文书
本科应届生求职信
2014/08/05 职场文书
商务考察邀请函模板
2015/02/02 职场文书
工厂无线对讲系统解决方案
2022/02/18 无线电