基于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 相关文章推荐
用php实现的获取网页中的图片并保存到本地的代码
Jan 05 PHP
DW中链接mysql数据库时,建立字符集中文出现乱码的解决方法
Mar 27 PHP
php中cookie的使用方法
Mar 29 PHP
PHP的switch判断语句的“高级”用法详解
Oct 01 PHP
分享php邮件管理器源码
Jan 06 PHP
Yii框架中jquery表单验证插件用法示例
Oct 18 PHP
php简单随机字符串生成方法示例
Apr 19 PHP
PC端微信扫码支付成功之后自动跳转php版代码
Jul 07 PHP
PHP数据库操作四:mongodb用法分析
Aug 16 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
Dec 25 PHP
php实现单笔转账到支付宝功能
Oct 09 PHP
CI框架附属类用法分析
Dec 26 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
一些关于PHP的知识
2006/11/17 PHP
php数组对百万数据进行排除重复数据的实现代码
2010/06/08 PHP
php读取mssql的ntext字段返回值为空的解决方法
2014/12/30 PHP
php内嵌函数用法实例
2015/03/20 PHP
PHP排序算法之堆排序(Heap Sort)实例详解
2018/04/21 PHP
laravel5.5安装jwt-auth 生成token令牌的示例
2019/10/24 PHP
js之WEB开发调试利器:Firebug 下载
2007/01/13 Javascript
JavaScript类库D
2010/10/24 Javascript
jQuery中需要注意的细节问题小结
2011/12/06 Javascript
js传参数受特殊字符影响错误的解决方法
2013/10/21 Javascript
jquery的map与get方法详解
2013/11/04 Javascript
javascript中数组的concat()方法使用介绍
2013/12/18 Javascript
javascript打开word文档的方法
2014/04/16 Javascript
用html5 js实现点击一个按钮达到浏览器全屏效果
2014/05/28 Javascript
Javascript动态创建表格及删除行列的方法
2015/05/15 Javascript
Vue-cli项目部署到Nginx服务器的方法
2019/11/01 Javascript
Vue实现base64编码图片间的切换功能
2019/12/04 Javascript
基于leaflet.js实现修改地图主题样式的流程分析
2020/05/15 Javascript
vue中watch和computed的区别与使用方法
2020/08/23 Javascript
详解Vue 的异常处理机制
2020/11/30 Vue.js
[54:24]Optic vs TNC 2018国际邀请赛小组赛BO2 第二场
2018/08/18 DOTA
用Python的Django框架完成视频处理任务的教程
2015/04/02 Python
基于Python_脚本CGI、特点、应用、开发环境(详解)
2017/05/23 Python
Python 操作文件的基本方法总结
2017/08/10 Python
python利用微信公众号实现报警功能
2018/06/10 Python
python pygame模块编写飞机大战
2018/11/20 Python
python 用opencv调用训练好的模型进行识别的方法
2018/12/07 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
2020/02/25 Python
python实现用户名密码校验
2020/03/18 Python
python用opencv 图像傅里叶变换
2021/01/04 Python
俄罗斯香水在线商店:AromaCode
2019/12/04 全球购物
EJB2和EJB3在架构上的不同点
2014/09/29 面试题
科技开发中心办公室主任岗位责任制
2014/02/10 职场文书
文明礼仪伴我行演讲稿
2014/05/12 职场文书
2014年保险公司工作总结
2014/11/22 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书