基于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 相关文章推荐
关于JSON以及JSON在PHP中的应用技巧
Nov 27 PHP
Laravel框架学习笔记(一)环境搭建
Oct 15 PHP
php实现事件监听与触发的方法
Nov 21 PHP
ThinkPHP模版引擎之变量输出详解
Dec 05 PHP
为百度UE编辑器上传图片添加水印功能
Apr 16 PHP
PHP实现C#山寨ArrayList的方法
Jul 16 PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
Dec 23 PHP
phalcon框架使用指南
Feb 23 PHP
PHP使用curl模拟post上传及接收文件的方法
Mar 04 PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
Sep 16 PHP
Laravel框架源码解析之入口文件原理分析
May 14 PHP
TP3.2框架分页相关实现方法分析
Jun 03 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
ASP知识讲座四
2006/10/09 PHP
PHP截取汉字乱码问题解决方法mb_substr函数的应用
2008/03/30 PHP
PHP输出时间差函数代码
2013/01/28 PHP
php实现的ping端口函数实例
2014/11/12 PHP
ThinkPHP3.2.2的插件控制器功能
2015/03/05 PHP
非集成环境的php运行环境(Apache配置、Mysql)搭建安装图文教程
2016/04/12 PHP
浅谈php(codeigniter)安全性注意事项
2017/04/06 PHP
PHP实现的字符串匹配算法示例【sunday算法】
2017/12/19 PHP
斜45度寻路实现函数
2009/08/20 Javascript
jquery+ashx无刷新GridView数据显示插件(实现分页、排序、过滤功能)
2010/04/25 Javascript
jquery中的 $(&quot;#jb51&quot;)与document.getElementById(&quot;jb51&quot;) 的区别
2011/07/26 Javascript
无闪烁更新网页内容JS实现
2013/12/19 Javascript
js获取光标位置和设置文本框光标位置示例代码
2014/01/09 Javascript
浅谈Javascript实现继承的方法
2015/07/06 Javascript
浅析jquery如何判断滚动条滚到页面底部并执行事件
2016/04/29 Javascript
关于微信中a链接无法跳转问题
2016/08/02 Javascript
原生js简单实现放大镜特效
2017/05/16 Javascript
10分钟上手vue-cli 3.0 入门介绍
2018/04/04 Javascript
微信小程序 多行文本显示...+显示更多按钮和收起更多按钮功能
2019/09/26 Javascript
Ant Design Vue 添加区分中英文的长度校验功能
2020/01/21 Javascript
Python 获取新浪微博的最新公共微博实例分享
2014/07/03 Python
基于Python_脚本CGI、特点、应用、开发环境(详解)
2017/05/23 Python
Python实现识别手写数字 Python图片读入与处理
2020/03/23 Python
解决python Markdown模块乱码的问题
2019/02/14 Python
如何在python中实现随机选择
2019/11/02 Python
Python selenium页面加载慢超时的解决方案
2020/03/18 Python
Python如何实现定时器功能
2020/05/28 Python
keras.utils.to_categorical和one hot格式解析
2020/07/02 Python
python 模块导入问题汇总
2021/02/01 Python
《小池塘》教学反思
2014/02/28 职场文书
个人贷款承诺书
2014/03/28 职场文书
教师师德演讲稿
2014/05/06 职场文书
革命英雄事迹演讲稿
2014/09/13 职场文书
关于工作时间玩手机的检讨书
2014/09/18 职场文书
旅游局领导班子“四风”问题对照检查材料思想汇报
2014/09/29 职场文书
关于Python OS模块常用文件/目录函数详解
2021/07/01 Python