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获取本周,上周,本月,上月,本季度日期的代码
Aug 05 PHP
Linux环境下搭建php开发环境的操作步骤
Jun 17 PHP
php获取淘宝分类id示例
Jan 16 PHP
ThinkPHP中ajax使用实例教程
Aug 22 PHP
PHP判断是否连接上网络的方法
Jul 01 PHP
thinkPHP统计排行与分页显示功能示例
Dec 02 PHP
详谈phpAdmin修改密码后拒绝访问的问题
Apr 03 PHP
PHP中的日期时间处理利器实例(Carbon)
Jun 09 PHP
PHP绕过open_basedir限制操作文件的方法
Jun 10 PHP
实例介绍PHP中zip_open()函数用法
Feb 15 PHP
php实现对文件压缩简单的方法
Sep 29 PHP
PHP中通过getopt解析GNU C风格命令行选项
Nov 18 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 获取mysql数据库信息代码
2009/03/12 PHP
PHP中MVC模式的模板引擎开发经验分享
2011/03/23 PHP
PHP错误WARNING: SESSION_START() [FUNCTION.SESSION-START]解决方法
2014/05/04 PHP
WordPress用户登录框密码的隐藏与部分显示技巧
2015/12/31 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
JS查看对象功能代码
2008/04/25 Javascript
Extjs TriggerField在弹出窗口显示不出问题的解决方法
2010/01/08 Javascript
jquery聚焦文本框与扩展文本框聚焦方法
2012/10/12 Javascript
jQuery图片滚动图片的效果(另类实现)
2013/06/02 Javascript
使用JSLint提高JS代码质量方法分享
2013/12/16 Javascript
网页实时显示服务器时间和javscript自运行时钟
2014/06/09 Javascript
解析AngularJS中get请求URL出现的跨域问题
2016/12/01 Javascript
Angularjs中ng-repeat-start与ng-repeat-end的用法实例介绍
2016/12/31 Javascript
Angularjs验证用户输入的字符串是否为日期时间
2017/06/01 Javascript
vue加载自定义的js文件方法
2018/03/13 Javascript
通过 JS 判断页面是否有滚动条的实现方法
2018/04/05 Javascript
加快Vue项目的开发速度的方法
2018/12/12 Javascript
详解使用React制作一个模态框
2019/03/14 Javascript
webpack是如何实现模块化加载的方法
2019/11/06 Javascript
python实现中文转换url编码的方法
2016/06/14 Python
Python在图片中添加文字的两种方法
2017/04/29 Python
Python实例方法、类方法、静态方法的区别与作用详解
2019/03/25 Python
Django框架模型简单介绍与使用分析
2019/07/18 Python
Python Django2 model 查询介绍(条件、范围、模糊查询)
2020/03/16 Python
python爬虫分布式获取数据的实例方法
2020/11/26 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
2021/01/26 Python
东南亚旅游平台:The Trip Guru
2018/01/01 全球购物
北欧最好的童装网上商店:Babyshop
2019/09/15 全球购物
俄罗斯皮肤健康中心:Pharmacosmetica.ru
2020/02/22 全球购物
中专生的个人自我评价
2013/12/11 职场文书
高中军训第一天感言
2014/03/06 职场文书
企业文明单位申报材料
2014/05/16 职场文书
大学新生军训自我鉴定范文
2014/09/13 职场文书
助学金感谢信
2015/01/20 职场文书
公司年夜饭通知
2015/04/25 职场文书
2016三八妇女节校园广播稿
2015/12/17 职场文书