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 异常处理实现代码
Mar 10 PHP
解析php安全性问题中的:Null 字符问题
Jun 21 PHP
php中opendir函数用法实例
Nov 15 PHP
php带抄送和密件抄送的邮件发送方法
Mar 20 PHP
php传值赋值和传地址赋值用法实例分析
Jun 20 PHP
Discuz!X中SESSION机制实例详解
Sep 23 PHP
php 利用array_slice函数获取随机数组或前几条数据
Sep 30 PHP
简单PHP会话(session)说明介绍
Aug 21 PHP
PHP中串行化用法示例
Nov 16 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
Sep 20 PHP
PHP实现网站应用微信登录功能详解
Apr 11 PHP
PHP const定义常量及global定义全局常量实例解析
May 28 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
PHP5.2下chunk_split()函数整数溢出漏洞 分析
2007/06/06 PHP
session在PHP大型web应用中的使用
2011/06/25 PHP
php截取指定2个字符之间字符串的方法
2015/04/15 PHP
用正则获取指定路径文件的名称
2007/02/27 Javascript
from 表单提交返回值用post或者是get方法实现
2013/08/21 Javascript
javascript单引号和双引号的区别和处理
2014/05/14 Javascript
IE6/IE7中JavaScript json提示缺少标识符、字符串或数字问题处理
2014/12/16 Javascript
浅析JS抽象工厂模式
2017/12/14 Javascript
微信小程序progress组件使用详解
2018/01/31 Javascript
解决vue-router中的query动态传参问题
2018/03/20 Javascript
react native 文字轮播的实现示例
2018/07/27 Javascript
jQuery实现的自定义轮播图功能详解
2018/12/28 jQuery
Electron + vue 打包桌面操作流程详解
2019/06/24 Javascript
Javascript实现鼠标移入方向感知
2020/06/24 Javascript
[00:36]DOTA2上海特级锦标赛 LGD战队宣传片
2016/03/04 DOTA
Python PyInstaller库基本使用方法分析
2019/12/12 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
2020/01/07 Python
mac 上配置Pycharm连接远程服务器并实现使用远程服务器Python解释器的方法
2020/03/19 Python
基于Python快速处理PDF表格数据
2020/06/03 Python
如何表示python中的相对路径
2020/07/08 Python
详解Canvas实用库Fabric.js使用手册
2019/01/07 HTML / CSS
欧洲第一中国智能手机和平板电脑网上商店:CECT-SHOP
2018/01/08 全球购物
美国最受欢迎的度假目的地优惠套餐:BookVIP
2018/09/27 全球购物
Napapijri西班牙在线商店:夹克、外套、运动衫等
2020/11/05 全球购物
Groupon西班牙官方网站:在线优惠券和交易,节省高达70%
2021/03/13 全球购物
PHP两种查询函数array/row的区别
2013/06/03 面试题
毕业生动漫设计求职信
2013/10/11 职场文书
办公室岗位职责
2014/02/12 职场文书
违反校纪校规检讨书
2014/02/15 职场文书
法律六进活动方案
2014/03/13 职场文书
道德大讲堂实施方案
2014/05/14 职场文书
公司投资建议书
2014/05/16 职场文书
Matplotlib可视化之添加让统计图变得简单易懂的注释
2021/06/11 Python
Python中Selenium对Cookie的操作方法
2021/07/09 Python
yyds什么意思?90后已经听不懂00后讲话了……
2022/02/03 杂记
无线电通信名词解释
2022/02/18 无线电