基于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 相关文章推荐
与数据库连接
Oct 09 PHP
PHP中MD5函数使用实例代码
Jun 07 PHP
那些年一起学习的PHP(二)
Mar 21 PHP
安装ImageMagick出现error while loading shared libraries的解决方法
Sep 23 PHP
PHP使用json_encode函数时不转义中文的解决方法
Nov 12 PHP
php判断并删除空目录及空子目录的方法
Feb 11 PHP
php简单实现快速排序的方法
Apr 04 PHP
php通过前序遍历树实现无需递归的无限极分类
Jul 10 PHP
WordPress开发中自定义菜单的相关PHP函数使用简介
Jan 05 PHP
PHP全局变量与超级全局变量区别分析
Apr 01 PHP
Yii 2.0自带的验证码使用经验分享
Jun 19 PHP
php post换行的方法
Feb 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
不用iconv库的gb2312与utf-8的互换函数
2006/10/09 PHP
分页显示Oracle数据库记录的类之二
2006/10/09 PHP
php jquery 实现新闻标签分类与无刷新分页
2009/12/18 PHP
php 字符串函数收集
2010/03/29 PHP
php一个找二层目录的小东东
2012/08/02 PHP
php实现session自定义会话处理器的方法
2015/01/27 PHP
php自定义中文字符串截取函数substr_for_gb2312及substr_for_utf8示例
2016/05/28 PHP
学习YUI.Ext 第二天
2007/03/10 Javascript
jQuery 插件 将this下的div轮番显示
2009/04/09 Javascript
基于json的jquery地区联动效果代码
2011/07/06 Javascript
基于jquery DOM写的类似微博发布的效果
2012/10/20 Javascript
如何将php数组或者对象传递给javascript
2014/03/20 Javascript
详解JS正则replace的使用方法
2016/03/06 Javascript
关于session和cookie的简单理解
2016/06/08 Javascript
JS监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
2016/08/05 Javascript
基于 Vue 的树形选择组件的示例代码
2017/08/18 Javascript
vue中子组件传递数据给父组件的讲解
2019/01/27 Javascript
VUE实现移动端列表筛选功能
2019/08/23 Javascript
关于angular 8.1使用过程中的一些记录
2020/11/25 Javascript
JavaScript中展开运算符及应用的实例代码
2021/01/14 Javascript
[01:10:57]Liquid vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python 解决flask 图片在线浏览或者直接下载的问题
2020/01/09 Python
英国著名的化妆品折扣网站:Allbeauty.com
2016/07/21 全球购物
日本化妆品植村秀俄罗斯官方网站:Shu Uemura俄罗斯
2020/02/01 全球购物
意大利领先的奢侈品在线时装零售商:MCLABELS
2020/10/13 全球购物
装潢设计实习自我鉴定
2013/09/19 职场文书
后勤园长自我鉴定
2013/10/17 职场文书
高中同学聚会邀请函
2014/01/11 职场文书
工艺员岗位职责
2014/02/11 职场文书
电子商务个人职业生涯规划范文
2014/02/12 职场文书
生产车间标语
2014/06/11 职场文书
驾驶员安全责任书范本
2014/07/24 职场文书
群众路线教育实践活动批评与自我批评
2014/09/15 职场文书
MySQL查看表和清空表的常用命令总结
2021/05/26 MySQL
关于JavaScript回调函数的深入理解
2021/06/27 Javascript
Window server中安装Redis的超详细教程
2021/11/17 Redis