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 相关文章推荐
解决php中Cannot send session cache limiter 的问题的方法
Apr 27 PHP
php mssql 日期出现中文字符的解决方法
Mar 10 PHP
PHP 图片文件上传实现代码
Dec 29 PHP
php实现简单洗牌算法
Jun 18 PHP
php生成excel文件的简单方法
Feb 08 PHP
PHP伪造来源HTTP_REFERER的方法实例详解
Jul 06 PHP
php生成唯一数字id的方法汇总
Nov 18 PHP
ThinkPHP模板循环输出Volist标签用法实例详解
Mar 23 PHP
php微信分享到朋友圈、QQ、朋友、微博
Feb 18 PHP
php ZipArchive实现多文件打包下载实例
Oct 31 PHP
PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)
Oct 30 PHP
微信小程序结合ThinkPHP5授权登陆后获取手机号
Nov 23 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面向接口编程 耦合设计模式 简单范例
2011/03/23 PHP
php实现以只读方式打开文件的方法
2015/03/16 PHP
详解如何实现Laravel的服务容器的方法示例
2019/04/15 PHP
js 跨域和ajax 跨域问题小结
2009/07/01 Javascript
JQuery FlexiGrid的asp.net完美解决方案 dotNetFlexGrid-.Net原生的异步表格控件
2010/09/12 Javascript
理解Javascript_05_原型继承原理
2010/10/13 Javascript
在NodeJS中启用ECMAScript 6小结(windos以及Linux)
2014/07/15 NodeJs
jquery实现键盘左右翻页特效
2015/04/30 Javascript
jquery实现多屏多图焦点图切换特效的方法
2015/05/04 Javascript
jQuery height()、innerHeight()、outerHeight()函数的区别详解
2016/05/23 Javascript
jQuery控制div实现随滚动条滚动效果
2016/06/07 Javascript
基于jQuery实现滚动刷新效果
2017/01/09 Javascript
ES6新特性之数组、Math和扩展操作符用法示例
2017/04/01 Javascript
简单实现jQuery手风琴效果
2017/08/18 jQuery
原生JS与JQ获取元素的区别详解
2020/02/13 Javascript
[01:01:18]VP vs NIP 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python类的基础入门知识
2008/11/24 Python
Python3.x和Python2.x的区别介绍
2013/02/12 Python
Python 判断是否为质数或素数的实例
2017/10/30 Python
Python 绘图库 Matplotlib 入门教程
2018/04/19 Python
python实现在cmd窗口显示彩色文字
2019/06/24 Python
Python的PIL库中getpixel方法的使用
2020/04/09 Python
Python reversed反转序列并生成可迭代对象
2020/10/22 Python
HTML5中input[type='date']自定义样式与日历校验功能的实现代码
2017/07/11 HTML / CSS
AmazeUI 评论列表的实现示例
2020/08/13 HTML / CSS
英国领先的家庭时尚品牌:Peacocks
2018/01/11 全球购物
BIFFI美国站:意大利BIFFI BOUTIQUES豪华多品牌时装零售公司
2020/02/11 全球购物
俄罗斯天然和有机产品、健康生活网上商店:Fitomarket.ru
2020/10/09 全球购物
九年级科学教学反思
2014/01/29 职场文书
班风学风建设方案
2014/05/06 职场文书
初中国旗下的演讲稿
2014/08/28 职场文书
名人演讲稿范文
2014/09/16 职场文书
行政执法队伍作风整顿个人剖析材料
2014/10/11 职场文书
2015年高校就业工作总结
2015/05/04 职场文书
600字作文之感受大自然
2019/11/27 职场文书
CSS3 制作的书本翻页特效
2021/04/13 HTML / CSS