PHP实现事件机制实例分析


Posted in PHP onJune 26, 2015

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

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

<?php
/**
* 事件
*
* @author xiezhenye <xiezhenye@gmail.com>
*/
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初学者头疼问题总结
Jul 08 PHP
PHP配置文件中最常用四个ini函数
Mar 19 PHP
smarty模板嵌套之include与fetch性能测试
Dec 05 PHP
解析php中die(),exit(),return的区别
Jun 20 PHP
Server.HTMLEncode让代码在页面里显示为源代码
Dec 08 PHP
PHP多维数组遍历方法(2种实现方法)
Dec 10 PHP
在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境
Apr 04 PHP
thinkPHP中钩子的使用方法实例分析
Nov 16 PHP
PHP封装cURL工具类与应用示例
Jul 01 PHP
TP5框架实现上传多张图片的方法分析
Mar 29 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
May 12 PHP
如何通过Apache在本地配置多个虚拟主机
Jul 29 PHP
php使用MySQL保存session会话的方法
Jun 26 #PHP
Linux操作系统安装LAMP环境
Jun 26 #PHP
PHP中Session可能会引起并发问题
Jun 26 #PHP
WAMP环境中扩展oracle函数库(oci)
Jun 26 #PHP
PHP获取当前相对于域名目录的方法
Jun 26 #PHP
php通过获取头信息判断图片类型的方法
Jun 26 #PHP
以文件形式缓存php变量的方法
Jun 26 #PHP
You might like
ajax+php打造进度条 readyState各状态
2010/03/20 PHP
PHP抓取及分析网页的方法详解
2016/04/26 PHP
XML+XSL 与 HTML 两种方案的结合
2007/04/22 Javascript
Convert Seconds To Hours
2007/06/16 Javascript
收藏Javascript中常用的55个经典技巧
2007/08/12 Javascript
国外的为初学者写的JavaScript教程
2008/06/09 Javascript
两种常用的javascript数组去重方法思路及代码
2013/03/26 Javascript
JavaScript按位运算符的应用简析
2014/02/04 Javascript
JavaScript数据结构与算法之链表
2016/01/29 Javascript
touch.js 拖动、缩放、旋转 (鼠标手势)功能代码
2017/02/04 Javascript
深入理解JavaScript创建对象的多种方式以及优缺点
2017/06/01 Javascript
webstorm中配置nodejs环境及npm的实例
2018/05/15 NodeJs
vue + element-ui的分页问题实现
2018/12/17 Javascript
Vue.js实现立体计算器
2020/02/22 Javascript
React生命周期原理与用法踩坑笔记
2020/04/28 Javascript
你准备好迎接vue3.0了吗
2020/04/28 Javascript
vue动态加载SVG文件并修改节点数据的操作代码
2020/08/17 Javascript
python 3利用BeautifulSoup抓取div标签的方法示例
2017/05/28 Python
Django 如何获取前端发送的头文件详解(推荐)
2017/08/15 Python
浅析Python中return和finally共同挖的坑
2017/08/18 Python
python绘制多个曲线的折线图
2020/03/23 Python
Python 实现两个服务器之间文件的上传方法
2019/02/13 Python
python elasticsearch环境搭建详解
2019/09/02 Python
Python线程障碍对象Barrier原理详解
2019/12/02 Python
Django自关联实现多级联动查询实例
2020/05/19 Python
python里的单引号和双引号的有什么作用
2020/06/17 Python
介绍下java.util.Arrays类
2012/10/16 面试题
入党介绍人评语
2014/05/06 职场文书
羽毛球比赛策划方案
2014/06/13 职场文书
合法的离婚协议书范本
2014/10/23 职场文书
个人简历自我评价怎么写
2015/03/10 职场文书
有关三国演义的读书笔记
2015/06/25 职场文书
2016廉洁从政心得体会
2016/01/19 职场文书
Nginx开启Brotli压缩算法实现过程详解
2021/03/31 Servers
Jupyter Notebook 如何修改字体和大小以及更改字体样式
2021/06/03 Python
Vue如何清空对象
2022/03/03 Vue.js