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 程序员应该使用的10个组件
Oct 31 PHP
关于查看MSSQL 数据库 用户每个表 占用的空间大小
Jun 21 PHP
php中的filesystem文件系统函数介绍及使用示例
Feb 13 PHP
php使用curl抓取qq空间的访客信息示例
Feb 28 PHP
PHP实现远程下载文件到本地
May 17 PHP
PHP环境搭建(php+Apache+mysql)
Nov 14 PHP
PHP 信号管理知识整理汇总
Feb 19 PHP
php注册审核重点解析(数据访问)
May 23 PHP
php表单处理操作
Nov 16 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
Aug 03 PHP
php提供实现反射的方法和实例代码
Sep 17 PHP
ThinkPHP5.0框架实现切换数据库的方法分析
Oct 30 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脚本的10个技巧(2)
2006/10/09 PHP
ThinkPHP中公共函数路径和配置项路径的映射分析
2014/11/22 PHP
php实现的网络相册图片防盗链完美破解方法
2015/07/01 PHP
PHP常用函数之base64图片上传功能详解
2019/10/21 PHP
Yii框架组件的事件机制原理与用法分析
2020/04/07 PHP
一个对于Array的简单扩展
2006/10/03 Javascript
改写一个简单的菜单 弹性大小
2010/12/02 Javascript
基于jquery自定义图片热区效果
2012/07/21 Javascript
JS和Jquery获取和修改label的值的示例代码
2014/01/15 Javascript
js处理自己不能定义二维数组的方法详解
2014/03/03 Javascript
js模拟hashtable的简单实例
2014/03/06 Javascript
json实现添加、遍历与删除属性的方法
2016/06/17 Javascript
微信小程序 form组件详解
2016/10/25 Javascript
JS鼠标滚动分页效果示例
2017/07/05 Javascript
JS中原始值和引用值的储存方式示例详解
2018/03/23 Javascript
深入理解react-router 路由的实现原理
2018/09/26 Javascript
JS使用new操作符创建对象的方法分析
2019/05/30 Javascript
简单了解TypeScript中如何继承 Error 类
2019/06/21 Javascript
[54:28]EG vs OG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
简单介绍Python中利用生成器实现的并发编程
2015/05/04 Python
详解使用python的logging模块在stdout输出的两种方法
2017/05/17 Python
用Python删除本地目录下某一时间点之前创建的所有文件的实例
2017/12/14 Python
Python中偏函数用法示例
2018/06/07 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
2018/07/04 Python
Python实现E-Mail收集插件实例教程
2019/02/06 Python
pytorch标签转onehot形式实例
2020/01/02 Python
使用Python判断一个文件是否被占用的方法教程
2020/12/16 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
2020/12/17 Python
用CSS3实现无限循环的无缝滚动的示例代码
2017/11/01 HTML / CSS
html5指南-5.使用web storage存储键值对的数据
2013/01/07 HTML / CSS
HTML5视频支持检测(检查浏览器是否支持视频播放)
2013/06/08 HTML / CSS
学习标兵获奖感言
2014/02/20 职场文书
2014年医学生毕业自我鉴定
2014/03/26 职场文书
双创工作实施方案
2014/03/26 职场文书
项目经理任命书内容
2014/06/06 职场文书
详解CSS不受控制的position fixed
2021/05/25 HTML / CSS