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 相关文章推荐
如何删除多级目录
Oct 09 PHP
PHP语法速查表
Dec 06 PHP
一个PHP并发访问实例代码
Sep 06 PHP
php $_SERVER windows系统与linux系统下的区别说明
Feb 14 PHP
thinkphp连贯操作实例分析
Nov 22 PHP
php使用fputcsv()函数csv文件读写数据的方法
Jan 06 PHP
php+jquery+html实现点击不刷新加载更多的实例代码
Aug 12 PHP
PHP编写daemon process 实例详解
Nov 13 PHP
php实现的三个常用加密解密功能函数示例
Nov 06 PHP
Laravel框架实现调用百度翻译API功能示例
May 30 PHP
PHP pthreads v3下worker和pool的使用方法示例
Feb 21 PHP
PHP中SESSION过期设置
Mar 09 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导出csv格式数据并将数字转换成文本的思路以及代码分享
2014/06/05 PHP
php实现猴子选大王问题算法实例
2015/04/20 PHP
Zend Framework教程之MVC框架的Controller用法分析
2016/03/07 PHP
PHP+Ajax+JS实现多图上传
2016/05/07 PHP
PHP设计模式之观察者模式定义与用法示例
2018/08/04 PHP
对联广告js flash激活
2006/10/19 Javascript
jquery中this的使用说明
2010/09/06 Javascript
如何正确使用Nodejs 的 c++ module 链接到 OpenSSL
2014/08/03 NodeJs
js获取checkbox复选框选中的选项实例
2014/08/24 Javascript
Node.js实现批量去除BOM文件头
2014/12/20 Javascript
jQuery中html()方法用法实例
2014/12/25 Javascript
HTML5+jQuery插件Quicksand实现超酷的星际争霸2兵种分类展示效果(附demo源码下载)
2016/05/25 Javascript
Angular.JS去掉访问路径URL中的#号详解
2017/03/30 Javascript
JS中mouseup事件丢失的原因与解决办法
2017/06/14 Javascript
jquery版轮播图效果和extend扩展
2017/07/18 jQuery
vue系列之requireJs中引入vue-router的方法
2018/07/18 Javascript
使用Python对SQLite数据库操作
2017/04/06 Python
Python 登录网站详解及实例
2017/04/11 Python
MAC中PyCharm设置python3解释器
2017/12/15 Python
Python3中详解fabfile的编写
2018/06/24 Python
python3.5绘制随机漫步图
2018/08/27 Python
解决python "No module named pip" 的问题
2018/10/13 Python
Django中modelform组件实例用法总结
2020/02/10 Python
如何将PySpark导入Python的放实现(2种)
2020/04/26 Python
解决python中0x80072ee2错误的方法
2020/07/19 Python
如何利用Python动态模拟太阳系运转
2020/09/04 Python
HTML5基于flash实现播放RTMP协议视频的示例代码
2020/12/04 HTML / CSS
香蕉共和国加拿大官网:Banana Republic加拿大
2018/08/06 全球购物
关于爱国的演讲稿
2014/05/07 职场文书
计算机网络及管理学专业求职信
2014/06/05 职场文书
幼儿园社区活动总结
2014/07/07 职场文书
党员群众路线对照检查材料思想汇报
2014/09/17 职场文书
2015年检察院个人工作总结
2015/05/20 职场文书
2016年大学生社会实践心得体会
2015/10/09 职场文书
Python基础之数据结构详解
2021/04/28 Python
Pytorch中Softmax与LogSigmoid的对比分析
2021/06/05 Python