基于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中查询SQL Server或Sybase时TEXT字段被截断的解决方法
Mar 10 PHP
PHP目录函数实现创建、读取目录教程实例
Jan 13 PHP
用PHP实现弹出消息提示框的两种方法
Dec 17 PHP
php实现读取手机客户端浏览器的类
Jan 09 PHP
smarty内置函数capture用法分析
Jan 22 PHP
memcache一致性hash的php实现方法
Mar 05 PHP
PHP数组相关函数汇总
Mar 24 PHP
常用的php图片处理类(水印、等比缩放、固定高宽)分享
Jun 19 PHP
ThinkPHP和UCenter接口冲突的解决方法
Jul 25 PHP
微信公众号开发之语音消息识别php代码
Aug 08 PHP
使用ThinkPHP生成缩略图及显示
Apr 27 PHP
PHP仿tp实现mvc框架基本设计思路与实现方法分析
May 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
PHP在线生成二维码(google api)的实现代码详解
2013/06/04 PHP
PHP5.4起内置web服务器使用方法
2016/08/09 PHP
PHP的mysqli_sqlstate()函数讲解
2019/01/23 PHP
Laravel6.0.4中将添加计划任务事件的方法步骤
2019/10/15 PHP
bcastr2.0 通用的图片浏览器
2006/11/22 Javascript
Javascript 生成指定范围数值随机数
2009/01/09 Javascript
用JavaScript编写COM组件的步骤
2009/03/17 Javascript
与jquery serializeArray()一起使用的函数,主要来方便提交表单
2011/01/31 Javascript
10个基于浏览器的JavaScript调试工具分享
2013/02/07 Javascript
php和js对数据库图片进行等比缩放示例
2014/04/28 Javascript
javascript学习笔记(七)Ajax和Http状态码
2014/10/08 Javascript
JS实现无限级网页折叠菜单(类似树形菜单)效果代码
2015/09/17 Javascript
简单的JS控制button颜色随点击更改的实现方法
2017/04/17 Javascript
jQuery实现锚点向下平滑滚动特效示例
2017/08/29 jQuery
微信小程序实现搜索历史功能
2020/03/26 Javascript
Vue 解决路由过渡动画抖动问题(实例详解)
2020/01/05 Javascript
vue中v-for循环选中点击的元素并对该元素添加样式操作
2020/07/17 Javascript
详解Python中的各种函数的使用
2015/05/24 Python
在centos7中分布式部署pyspider
2017/05/03 Python
利用pyuic5将ui文件转换为py文件的方法
2019/06/19 Python
Django框架中序列化和反序列化的例子
2019/08/06 Python
python多进程间通信代码实例
2019/09/30 Python
纯CSS3编写的的精美动画进度条(无flash/无图像/无脚本/附源码)
2013/01/07 HTML / CSS
浅谈amaze-ui中datepicker和datetimepicker注意的几点
2020/08/21 HTML / CSS
英国著名音像制品和图书游戏购物网站:Zavvi
2016/08/04 全球购物
澳大利亚礼品篮网站:Macarthur Baskets
2019/10/14 全球购物
单位未婚证明范本
2014/01/18 职场文书
工作证明范本(2篇)
2014/09/14 职场文书
学生会个人总结范文
2015/02/15 职场文书
2015年大学团支部工作总结
2015/05/13 职场文书
酒桌上的祝酒词
2015/08/12 职场文书
2016年中秋节寄语大全
2015/12/07 职场文书
Canvas三种动态画圆实现方法说明(小结)
2021/04/16 Javascript
浅谈Redis主从复制以及主从复制原理
2021/05/29 Redis
关于Python中*args和**kwargs的深入理解
2021/08/07 Python
2021好看的国漫排行榜前十名 《完美世界》上榜,《元龙》排名第一
2022/03/18 国漫