基于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 相关文章推荐
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
Apr 07 PHP
基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
Apr 28 PHP
php实现的递归提成方案实例
Nov 14 PHP
PHP中error_reporting函数用法详细介绍
Jun 11 PHP
php使用 readfile() 函数设置文件大小大小的方法
Aug 11 PHP
php制作圆形用户头像的实例_自定义封装类源代码
Sep 18 PHP
thinkPHP框架实现多表查询的方法
Jun 14 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
Dec 20 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解
Apr 09 PHP
Thinkphp5 自定义上传文件名的实现方法
Jul 23 PHP
Yii框架数据库查询、增加、删除操作示例
Oct 14 PHP
tp5使用layui实现多个图片上传(带附件选择)的方法实例
Nov 17 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代码优化及php相关问题总结
2006/10/09 PHP
基于OpenCV的PHP图像人脸识别技术
2009/10/11 PHP
php小型企业库存管理系统的设计与实现代码
2011/05/16 PHP
PHP脚本监控Nginx 502错误并自动重启php-fpm
2015/05/13 PHP
JavaScript与HTML结合的基本使用方法整理
2015/10/12 PHP
简单的php+mysql聊天室实现方法(附源码)
2016/01/05 PHP
Zend Framework教程之动作的基类Zend_Controller_Action详解
2016/03/07 PHP
浅谈mysql_query()函数的返回值问题
2016/09/05 PHP
Yii框架常见缓存应用实例小结
2019/09/09 PHP
PHP设计模式之外观模式(Facade)入门与应用详解
2019/12/13 PHP
Yii中特殊行为ActionFilter的使用方法示例
2020/10/18 PHP
深入理解JavaScript系列(2) 揭秘命名函数表达式
2012/01/15 Javascript
基于jQuery实现下拉收缩(展开与折叠)特效
2012/12/25 Javascript
表单序列化与jq中的serialize使用示例
2014/02/21 Javascript
JS中改变this指向的方法(call和apply、bind)
2016/03/26 Javascript
JavaScript获取服务器端时间的方法
2016/11/29 Javascript
详解vue-cli构建项目反向代理配置
2017/09/07 Javascript
JQuery用$.ajax或$.getJSON跨域获取JSON数据的实现代码
2017/09/23 jQuery
关于vue中watch检测到不到对象属性的变化的解决方法
2018/02/08 Javascript
vue路由事件beforeRouteLeave及组件内定时器的清除方法
2018/09/29 Javascript
京东优选小程序的实现代码示例
2020/02/25 Javascript
vue项目配置使用flow类型检查的步骤
2020/03/18 Javascript
vue中touch和click共存的解决方式
2020/07/28 Javascript
[01:49]一目了然!DOTA2DotA快捷操作对比第二弹
2014/05/16 DOTA
Python实现合并字典的方法
2015/07/07 Python
在Django同1个页面中的多表单处理详解
2017/01/25 Python
Python中元组,列表,字典的区别
2017/05/21 Python
TensorFlow实现MLP多层感知机模型
2018/03/09 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
2018/07/31 Python
Python实现去除图片中指定颜色的像素功能示例
2019/04/13 Python
python global关键字的用法详解
2019/09/05 Python
解决jupyter运行pyqt代码内核重启的问题
2020/04/16 Python
德国2018年度最佳在线药房:Bodfeld Apotheke
2019/11/04 全球购物
SOA面试题:如何在SOA中实现松耦合
2013/07/21 面试题
元宵节主持词
2014/03/25 职场文书
免职通知
2015/04/23 职场文书