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 相关文章推荐
MYSQL数据库初学者使用指南
Nov 16 PHP
ThinkPHP模版中导入CSS和JS文件的方法
Nov 29 PHP
Yii框架中memcache用法实例
Dec 03 PHP
Zend Guard使用指南及问题处理
Jan 07 PHP
smarty内置函数capture用法分析
Jan 22 PHP
php使用ZipArchive函数实现文件的压缩与解压缩
Oct 27 PHP
PHP中Restful api 错误提示返回值实现思路
Apr 12 PHP
PHP静态成员变量和非静态成员变量详解
Feb 14 PHP
PHP正则匹配操作简单示例【preg_match_all应用】
Jul 10 PHP
Thinkphp5+uploadify实现的文件上传功能示例
May 26 PHP
Thinkphp整合阿里云OSS图片上传实例代码
Apr 28 PHP
Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】
Dec 03 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
上传文件先创建目录 再上传到目录里面去
2010/12/29 PHP
PHP Parse Error: syntax error, unexpected $end 错误的解决办法
2012/06/05 PHP
PHP文件上传主要代码讲解
2013/09/30 PHP
PHP积分兑换接口实例
2015/02/09 PHP
Laravel与CI框架中截取字符串函数
2016/05/08 PHP
PHP针对redis常用操作实例详解
2019/08/17 PHP
tp5框架无刷新分页实现方法分析
2019/09/26 PHP
模拟多级复选框效果的jquery代码
2013/08/13 Javascript
JS保存和删除cookie操作 判断cookie是否存在
2013/11/13 Javascript
jQuery动态改变图片显示大小(修改版)的实现思路及代码
2013/12/24 Javascript
JavaScript实现动态创建CSS样式规则方案
2014/09/06 Javascript
详细解读AngularJS中的表单验证编程
2015/06/19 Javascript
JavaScript引用类型和基本类型详解
2016/01/06 Javascript
JavaScript性能优化总结之加载与执行
2016/08/11 Javascript
AngularJS实现标签页的两种方式
2016/09/05 Javascript
详细介绍RxJS在Angular中的应用
2017/09/23 Javascript
基于iview的router常用控制方式
2019/05/30 Javascript
node脚手架搭建服务器实现token验证的方法
2021/01/20 Javascript
[00:12]DAC SOLO赛卫冕冠军 VG.Paparazi灬展现SOLO技巧
2018/04/06 DOTA
python自动化工具日志查询分析脚本代码实现
2013/11/26 Python
浅谈Python中的作用域规则和闭包
2018/03/20 Python
python:按行读入,排序然后输出的方法
2019/07/20 Python
pyqt5、qtdesigner安装和环境设置教程
2019/09/25 Python
python 读取更新中的log 或其它文本方式
2019/12/24 Python
Python如何基于smtplib发不同格式的邮件
2019/12/30 Python
基于Python实现视频的人脸融合功能
2020/06/12 Python
python3 中使用urllib问题以及urllib详解
2020/08/03 Python
python 实现&quot;神经衰弱&quot;翻牌游戏
2020/11/09 Python
Python基于unittest实现测试用例执行
2020/11/25 Python
介绍一下gcc特性
2015/10/31 面试题
六个一活动实施方案
2014/03/21 职场文书
校园会短篇的广播稿
2014/10/21 职场文书
地道战观后感
2015/06/04 职场文书
吴仁宝观后感
2015/06/09 职场文书
《家庭教育》读后感3篇
2019/12/18 职场文书
numpy数据类型dtype转换实现
2021/04/24 Python