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支持断点续传的源码
May 16 PHP
.htaccess文件保护实例讲解
Feb 06 PHP
一个PHP的ZIP压缩类分享
May 04 PHP
php中多维数组按指定value排序的实现代码
Aug 19 PHP
php实现图片添加描边字和马赛克的方法
Dec 10 PHP
实现PHP+Mysql无限分类的方法汇总
Mar 02 PHP
PHP SPL标准库之SplFixedArray使用实例
May 12 PHP
PHP微信支付实例解析
Jul 22 PHP
php操纵mysqli数据库的实现方法
Sep 18 PHP
thinkPHP+LayUI 流加载实现功能
Sep 27 PHP
解决在laravel中auth建立时候遇到的问题
Oct 15 PHP
php让json_encode不自动转义斜杠“/”的方法
Apr 27 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
PHP中的超全局变量
2006/10/09 PHP
ADODB结合SMARTY使用~超级强
2006/11/25 PHP
ThinkPHP中处理表单中的注意事项
2014/11/22 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
2019/09/29 PHP
主页面中的两个iframe实现鼠标拖动改变其大小
2013/04/16 Javascript
javascript通过navigator.userAgent识别各种浏览器
2013/10/25 Javascript
js定时器的使用(实例讲解)
2014/01/06 Javascript
js跨域问题浅析及解决方法优缺点对比
2014/11/08 Javascript
jQuery.Highcharts.js绘制柱状图饼状图曲线图
2015/03/14 Javascript
jQuery实现的多屏图像图层切换效果实例
2015/05/07 Javascript
TypeScript 中接口详解
2015/06/19 Javascript
javascript中setInterval的用法
2015/07/19 Javascript
基于jQuery实现返回顶部实例代码
2016/01/01 Javascript
非常棒的jQuery图片轮播效果
2016/04/17 Javascript
jQuery UI结合Ajax创建可定制的Web界面
2016/06/22 Javascript
读Javascript高性能编程重点笔记
2016/12/21 Javascript
JS绘制微信小程序画布时钟
2016/12/24 Javascript
node.js中express-session配置项详解
2017/05/31 Javascript
一次围绕setTimeout的前端面试经验分享
2017/06/15 Javascript
bootstrap daterangepicker汉化以及扩展功能
2017/06/15 Javascript
js 索引下标之li集合绑定点击事件
2018/01/12 Javascript
vue2.0实现音乐/视频播放进度条组件
2018/06/06 Javascript
Vue.js样式动态绑定实现小结
2019/01/24 Javascript
python 调用钉钉机器人的方法
2019/02/20 Python
django的settings中设置中文支持的实现
2019/04/28 Python
python opencv摄像头的简单应用
2019/06/06 Python
python使用 zip 同时迭代多个序列示例
2019/07/06 Python
Python获取excel内容及相关操作代码实例
2020/08/10 Python
what is the difference between ext2 and ext3
2015/08/25 面试题
servlet面试题
2012/08/20 面试题
英文自我鉴定
2013/12/10 职场文书
银行竞聘演讲稿范文
2014/04/23 职场文书
贵阳市党的群众路线教育实践活动党(工)委领导班子整改方案
2014/10/26 职场文书
怎样写好演讲稿题目?
2019/08/21 职场文书
CSS3 实现NES游戏机的示例代码
2021/04/21 HTML / CSS
Python基于Tkinter开发一个爬取B站直播弹幕的工具
2021/05/06 Python