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中配置文件现在需要绝密的短语密码的解决方法
Feb 11 PHP
Zend studio for eclipse中使php可以调用mysql相关函数的设置方法
Oct 13 PHP
php下关于中英数字混排的字符串分割问题
Apr 06 PHP
PHP中return 和 exit 、break和contiue 区别与用法
Apr 09 PHP
php教程 插件机制在PHP中实现方案
Nov 02 PHP
php中ltrim()、rtrim()与trim()删除字符空格实例
Nov 25 PHP
PHP+AJAX实现投票功能的方法
Sep 28 PHP
PHP搭建大文件切割分块上传功能示例
Jan 04 PHP
浅谈laravel中的关联查询with的问题
Oct 10 PHP
PHP实现通过二维数组键值获取一维键名操作示例
Oct 11 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
May 26 PHP
PHP如何通过date() 函数格式化显示时间
Nov 13 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中使用SimpleXML检查XML文件结构实例
2015/01/07 PHP
Laravel中如何增加自定义全局函数详解
2017/05/09 PHP
php实现获取近几日、月时间示例
2019/07/06 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
2020/11/10 PHP
Sample script that deletes a SQL Server database
2007/06/16 Javascript
JavaScript 自动分号插入(JavaScript synat:auto semicolon insertion)
2009/11/04 Javascript
jquery中checkbox使用方法简单实例演示
2015/11/24 Javascript
AngularJS 最常用的功能汇总
2016/02/17 Javascript
bootstrap侧边栏圆点导航
2017/01/11 Javascript
原生js实现对Ajax的封装(仿jquery)
2017/01/22 Javascript
如何快速上手Vuex
2017/02/14 Javascript
提高JavaScript执行效率的23个实用技巧
2017/03/01 Javascript
从零开始学习Node.js系列教程二:文本提交与显示方法
2017/04/13 Javascript
详解.vue文件解析的实现
2018/06/11 Javascript
通过js示例讲解时间复杂度与空间复杂度
2019/08/06 Javascript
websocket4.0+typescript 实现热更新的方法
2019/08/14 Javascript
python 脚本生成随机 字母 + 数字密码功能
2018/05/26 Python
在NumPy中创建空数组/矩阵的方法
2018/06/15 Python
Selenium定时刷新网页的实现代码
2018/10/31 Python
Python2和Python3中urllib库中urlencode的使用注意事项
2018/11/26 Python
python async with和async for的使用
2019/06/20 Python
python 伯努利分布详解
2020/02/25 Python
python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法
2020/02/26 Python
python3.6中anaconda安装sklearn踩坑实录
2020/07/28 Python
Anaconda详细安装步骤图文教程
2020/11/12 Python
CSS3属性box-shadow使用详细教程
2012/01/21 HTML / CSS
使用html2canvas将页面转成图并使用用canvas2image下载
2019/04/04 HTML / CSS
Belle Maison倍美丛官网:日本千趣会旗下邮购网站
2016/07/22 全球购物
美国高端医师级美容产品电商:BeautifiedYou.com
2017/04/17 全球购物
美国电子元器件分销商:Newark element14
2018/01/13 全球购物
Bibloo罗马尼亚网站:女装、男装、童装及鞋子和配饰
2019/07/20 全球购物
Jowissa官方网站:瑞士制造的手表,优雅简约的设计
2020/07/29 全球购物
医学生个人求职信范文
2013/09/24 职场文书
新闻网站实习自我鉴定
2013/09/25 职场文书
一份婚庆公司创业计划书
2014/01/11 职场文书
教你如何让spark sql写mysql的时候支持update操作
2022/02/15 MySQL