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 相关文章推荐
将OICQ数据转成MYSQL数据
Oct 09 PHP
php中使用Akismet防止垃圾评论的代码
Jun 10 PHP
php DOS攻击实现代码(附如何防范)
May 29 PHP
php 批量生成html,txt文件的实现代码
Jun 26 PHP
php数组排序usort、uksort与sort函数用法
Nov 17 PHP
Laravel 5框架学习之向视图传送数据
Apr 08 PHP
php自动识别文字编码并转换为目标编码的方法
Aug 08 PHP
PHP实现的mysql主从数据库状态检测功能示例
Jul 20 PHP
php获取微信共享收货地址的方法
Dec 21 PHP
php图片裁剪函数
Oct 31 PHP
Laravel框架基于ajax实现二级联动功能示例
Jan 17 PHP
Laravel框架集合用法实例浅析
May 14 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 读取Postgresql中的数组
2013/04/14 PHP
thinkPHP实现瀑布流的方法
2014/11/29 PHP
php+Memcached实现简单留言板功能示例
2017/02/15 PHP
PHP实现对xml的增删改查操作案例分析
2017/05/19 PHP
Laravel 5.4重新登录实现跳转到登录前页面的原理和方法
2017/07/13 PHP
PHP实现随机数字、字母的验证码功能
2018/08/01 PHP
JavaScript访问样式表代码
2010/10/15 Javascript
jquery ajax return没有返回值的解决方法
2011/10/20 Javascript
再谈querySelector和querySelectorAll的区别与联系
2012/04/20 Javascript
实例分析js和C#中使用正则表达式匹配a标签
2014/11/26 Javascript
jQuery实现的经典滑动门效果
2015/09/22 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
2015/10/22 Javascript
跟我学习javascript的Date对象
2015/11/19 Javascript
vue.js或js实现中文A-Z排序的方法
2018/03/08 Javascript
浅析Vue 生命周期
2018/06/21 Javascript
微信小程序之自定义组件的实现代码(附源码)
2018/08/02 Javascript
详解Vue.directive 自定义指令
2019/03/27 Javascript
用node.js写一个jenkins发版脚本
2019/05/21 Javascript
ES6 Symbol数据类型的应用实例分析
2019/06/26 Javascript
layui框架与SSM前后台交互的方法
2019/09/12 Javascript
详解JSON.stringify()的5个秘密特性
2020/05/26 Javascript
微信小程序多列表渲染数据开关互不影响的实现
2020/06/05 Javascript
判断网页编码的方法python版
2016/08/12 Python
selenium + python 获取table数据的示例讲解
2018/10/13 Python
python 获取utc时间转化为本地时间的方法
2018/12/31 Python
浅谈PyTorch的可重复性问题(如何使实验结果可复现)
2020/02/20 Python
Python实现Excel自动分组合并单元格
2021/02/22 Python
ALEX AND ANI:手镯,项链,耳环和更多
2017/04/20 全球购物
英国时尚优质的女装:Hope Fashion
2018/08/14 全球购物
培训心得体会
2013/12/29 职场文书
工程班组长岗位职责
2013/12/30 职场文书
司马光教学反思
2014/02/01 职场文书
领导干部作风整顿个人剖析材料
2014/10/11 职场文书
预备党员党支部意见
2015/06/02 职场文书
心得体会格式及范文
2016/01/25 职场文书
使用python求解迷宫问题的三种实现方法
2022/03/17 Python