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 相关文章推荐
如何用phpmyadmin设置mysql数据库用户的权限
Jan 09 PHP
PHP优于Node.js的五大理由分享
Sep 15 PHP
深入PHP中的HashTable结构详解
Jun 13 PHP
PHP统计nginx访问日志中的搜索引擎抓取404链接页面路径
Jun 30 PHP
Yii查询生成器(Query Builder)用法实例教程
Sep 04 PHP
thinkphp循环结构用法实例
Nov 24 PHP
php递归法读取目录及文件的方法
Jan 30 PHP
PHP获得数组交集与差集的方法
Jun 10 PHP
PHP函数实现从一个文本字符串中提取关键字的方法
Jul 01 PHP
PHP中仿制 ecshop验证码实例
Jan 06 PHP
PHP设计模式之观察者模式定义与用法分析
Apr 04 PHP
PHP调用QQ互联接口实现QQ登录网站功能示例
Oct 24 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中fsockopen用法实例
2015/01/05 PHP
PHP往XML中添加节点的方法
2015/03/12 PHP
Yii2压缩PHP中模板代码的输出问题
2018/08/28 PHP
javascript 混合的构造函数和原型方式,动态原型方式
2009/12/07 Javascript
JQuery Highcharts 动态生成图表的方法
2013/11/15 Javascript
JavaScript中判断整字类型最简洁的实现方法
2014/11/08 Javascript
微信小程序  audio音频播放详解及实例
2016/11/02 Javascript
pc加载更多功能和移动端下拉刷新加载数据
2016/11/07 Javascript
JS搜狐面试题分析
2016/12/16 Javascript
基于JS实现移动端左滑删除功能
2017/07/28 Javascript
浅谈JsonObject中的key-value数据解析排序问题
2017/12/06 Javascript
在vue中使用css modules替代scroped的方法
2018/03/10 Javascript
微信小程序之判断页面滚动方向的示例代码
2018/08/30 Javascript
用WebStorm进行Angularjs 2开发(环境篇:Windows 10,Angular-cli方式)
2018/12/05 Javascript
JavaScript碎片—函数闭包(模拟面向对象)
2019/03/13 Javascript
Node.js API详解之 dns模块用法实例分析
2020/05/15 Javascript
Python实现的百度站长自动URL提交小工具
2014/06/27 Python
python利用正则表达式搜索单词示例代码
2017/09/24 Python
urllib和BeautifulSoup爬取维基百科的词条简单实例
2018/01/17 Python
Python实现读取机器硬件信息的方法示例
2018/06/09 Python
Django 连接sql server数据库的方法
2018/06/30 Python
python保存文件方法小结
2018/07/27 Python
通过PYTHON来实现图像分割详解
2019/06/26 Python
关于tf.nn.dynamic_rnn返回值详解
2020/01/20 Python
详细分析Python可变对象和不可变对象
2020/07/09 Python
CSS3使用transition属性实现过渡效果
2018/04/18 HTML / CSS
HTML5 Canvas的性能提高技巧经验分享
2013/07/02 HTML / CSS
amazeui模态框弹出后立马消失并刷新页面
2020/08/19 HTML / CSS
SmartBuyGlasses意大利:购买太阳镜、眼镜和隐形眼镜
2018/11/20 全球购物
Theo + George官方网站:都柏林时尚品牌
2019/04/08 全球购物
Ariat英国官网:为世界顶级马术运动员制造最优质的鞋类和服装
2020/02/14 全球购物
物流毕业生个人的自我评价
2014/02/13 职场文书
关于运动会的广播稿50字
2014/10/17 职场文书
年度考核表个人总结
2015/03/06 职场文书
领导莅临指导欢迎词
2015/09/30 职场文书
导游词之山东孔庙
2019/11/04 职场文书