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 相关文章推荐
通过html表格发电子邮件
Oct 09 PHP
PHP+DBM的同学录程序(4)
Oct 09 PHP
PHP的可变变量名的使用方法分享
Feb 05 PHP
PHP跨时区(UTC时间)应用解决方案
Jan 11 PHP
php中使用$_REQUEST需要注意的一个问题
May 02 PHP
基于PHP Socket配置以及实例的详细介绍
Jun 13 PHP
根据ip调用新浪api获取城市名并转成拼音
Mar 07 PHP
PHP自动重命名文件实现方法
Nov 04 PHP
php生成与读取excel文件
Oct 14 PHP
php使用file函数、fseek函数读取大文件效率对比分析
Nov 04 PHP
swoole和websocket简单聊天室开发
Nov 18 PHP
PHP面试题 wakeup魔法 Ezpop pop序列化与反序列化
Apr 11 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
10条PHP编程习惯助你找工作
2008/09/29 PHP
PHP7.0安装笔记整理
2015/08/28 PHP
PHP简单读取PDF页数的实现方法
2016/07/21 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
PHP随机数函数rand()与mt_rand()的讲解
2019/03/25 PHP
php解决约瑟夫环算法实例分析
2019/09/30 PHP
分享14个很酷的jQuery导航菜单插件
2011/04/25 Javascript
jQuery结合PHP+MySQL实现二级联动下拉列表[实例]
2011/11/15 Javascript
用unescape反编码得出汉字示例
2014/04/24 Javascript
一个字符串反转函数可实现字符串倒序
2014/09/15 Javascript
js实现的四级左侧网站分类菜单实例
2015/05/06 Javascript
Vue.directive自定义指令的使用详解
2017/03/10 Javascript
详细介绍RxJS在Angular中的应用
2017/09/23 Javascript
利用vue开发一个所谓的数独方法实例
2017/12/21 Javascript
webpack分离css单独打包的方法
2018/06/12 Javascript
trackingjs+websocket+百度人脸识别API实现人脸签到
2018/11/26 Javascript
vue 之 css module的使用方法
2018/12/04 Javascript
基于Vue el-autocomplete 实现类似百度搜索框功能
2019/10/25 Javascript
Django在Win7下的安装及创建项目hello word简明教程
2014/07/14 Python
python实现根据主机名字获得所有ip地址的方法
2015/06/28 Python
Python实现截屏的函数
2015/07/25 Python
举例讲解Python面相对象编程中对象的属性与类的方法
2016/01/19 Python
Python使用设计模式中的责任链模式与迭代器模式的示例
2016/03/02 Python
使用Python将数组的元素导出到变量中(unpacking)
2016/10/27 Python
python,Django实现的淘宝客登录功能示例
2019/06/12 Python
Pycharm连接远程服务器并实现远程调试的实现
2019/08/02 Python
numpy:np.newaxis 实现将行向量转换成列向量
2019/11/30 Python
pytorch下大型数据集(大型图片)的导入方式
2020/01/08 Python
Python基于pyecharts实现关联图绘制
2020/03/27 Python
HTML5+lufylegend实现游戏中的卷轴
2016/02/29 HTML / CSS
如何现实servlet的单线程模式
2014/08/05 面试题
医生进修自我鉴定
2014/01/19 职场文书
抽样调查项目计划书
2014/04/24 职场文书
安全保证书范文
2014/04/29 职场文书
公民授权委托书
2014/10/15 职场文书
Python中glob库实现文件名的匹配
2021/06/18 Python