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 相关文章推荐
DedeCms模板安装/制作概述
Mar 11 PHP
php二分法在IP地址查询中的应用
Aug 12 PHP
分享下页面关键字抓取components.arrow.com站点代码
Jan 30 PHP
五款PHP代码重构工具推荐
Oct 14 PHP
使用PHP+AJAX让WordPress动态加载文章的教程
Dec 11 PHP
ucenter中词语过滤原理分析
Jul 13 PHP
yii2 RBAC使用DbManager实现后台权限判断的方法
Jul 23 PHP
PHP CodeIgniter分页实例及多条件查询解决方案(推荐)
May 20 PHP
php命令行写shell实例详解
Jul 19 PHP
tp5框架使用composer实现日志记录功能示例
Jan 10 PHP
解决Laravel自定义类引入和命名空间的问题
Oct 15 PHP
laravel 解决多库下的DB::transaction()事务失效问题
Oct 21 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
优化使用mysql存储session的php代码
2008/01/10 PHP
PHP实现UTF-8文件BOM自动检测与移除实例
2014/11/05 PHP
IE下写xml文件的两种方式(fso/saveAs)
2013/08/05 Javascript
深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP详解
2015/03/05 Javascript
Bootstrap每天必学之下拉菜单
2015/11/25 Javascript
分享jQuery插件的学习笔记
2016/01/14 Javascript
AngularJS入门教程引导程序
2016/08/18 Javascript
用js制作淘宝放大镜效果
2020/10/28 Javascript
jQuery实现淡入淡出的模态框
2017/02/09 Javascript
js实现常见的工具条效果
2017/03/02 Javascript
BootStrap 表单控件之单选按钮水平排列
2017/05/23 Javascript
Axios学习笔记之使用方法教程
2017/07/21 Javascript
浅析Vue实例以及生命周期
2018/08/14 Javascript
Vue.js图片预览插件使用详解
2018/08/27 Javascript
JS实现的tab页切换效果完整示例
2018/12/18 Javascript
highCharts提示框中显示当前时间的方法
2019/01/18 Javascript
利用d3.js实现蜂巢图表带动画效果
2019/09/03 Javascript
js实现抽奖功能
2020/11/24 Javascript
[38:44]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第二局
2016/02/25 DOTA
Python中Iterator迭代器的使用杂谈
2016/06/20 Python
浅谈django开发者模式中的autoreload是如何实现的
2017/08/18 Python
Python中摘要算法MD5,SHA1简介及应用实例代码
2018/01/09 Python
python机器学习理论与实战(六)支持向量机
2018/01/19 Python
Python反射的用法实例分析
2018/02/11 Python
对Python3中的print函数以及与python2的对比分析
2018/05/02 Python
selenium+python自动化测试之页面元素定位
2019/01/23 Python
python 同时读取多个文件的例子
2019/07/16 Python
pygame实现五子棋游戏
2019/10/29 Python
Python连接mysql方法及常用参数
2020/09/01 Python
css3 中translate和transition的使用方法
2020/03/26 HTML / CSS
澳大利亚顶级美发和美容贸易超市:glamaCo
2020/01/19 全球购物
承办会议欢迎词
2014/01/17 职场文书
网络工程师自荐书范文
2014/04/01 职场文书
爱心捐书活动总结
2014/07/05 职场文书
晚自修旷课检讨书怎么写
2014/11/17 职场文书
专业技术职务聘任证明
2015/03/02 职场文书