基于PHP实现的事件机制实例分析


Posted in PHP onJune 18, 2015

本文实例讲述了基于PHP实现的事件机制。分享给大家供大家参考。具体分析如下:

内置了事件机制的语言不多,php也没有提供这样的功能。事件(Event)说简单了就是一个Observer模式,实现起来很容易。但是有所不同的是,事件的监听者谁都可以加,但是只能由直接包含它的对象触发。这就有一点点难度了。php有一个debug_backtrace函数,可以得到当前的调用栈,由此可以找到判断调用事件触发函数的对象是不是直接包含它的对象的办法。

<?php
/**
* 事件
*
* @author xiezhenye <xiezhenye@gmail.com>
* @since 2007-7-20
*/
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 相关文章推荐
PHP5.0对象模型探索之抽象方法和抽象类
Sep 05 PHP
基于PHP文件操作的详解
Jun 05 PHP
PHP获取当前页面完整URL的实现代码
Jun 10 PHP
ThinkPHP验证码使用简明教程
Mar 05 PHP
Laravel 5框架学习之数据库迁移(Migrations)
Apr 08 PHP
php实现CSV文件导入和导出
Oct 24 PHP
PHP下SSL加密解密、验证、签名方法(很简单)
Jun 28 PHP
php解决和避免form表单重复提交的几种方法
Aug 31 PHP
php7安装yar扩展的方法详解
Aug 03 PHP
PHP抽象类与接口的区别实例详解
May 09 PHP
laravel 使用事件系统统计浏览量的实现
Oct 16 PHP
php 函数中静态变量使用的问题实例分析
Mar 05 PHP
php使用MySQL保存session会话的方法
Jun 18 #PHP
php判断表是否存在的方法
Jun 18 #PHP
PHP实现HTTP断点续传的方法
Jun 17 #PHP
PHP实现在线阅读PDF文件的方法
Jun 17 #PHP
php源码分析之DZX1.5字符串截断函数cutstr用法
Jun 17 #PHP
php源码分析之DZX1.5加密解密函数authcode用法
Jun 17 #PHP
php源码分析之DZX1.5随机数函数random用法
Jun 17 #PHP
You might like
一个odbc连mssql分页的类
2006/10/09 PHP
不要轻信 PHP_SELF的安全问题
2009/09/05 PHP
php实现的双色球算法示例
2017/06/20 PHP
用JavaScript调用WebService的示例
2008/04/07 Javascript
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
2013/02/26 Javascript
关于JavaScript与HTML的交互事件
2013/04/12 Javascript
关于jquery中全局函数each使用介绍
2013/12/10 Javascript
Javascript 学习笔记之 对象篇(二) : 原型对象
2014/06/24 Javascript
浅谈javascript原型链与继承
2015/07/13 Javascript
D3.js实现折线图的方法详解
2016/09/21 Javascript
进阶之初探nodeJS
2017/01/24 NodeJs
js实现网页定位导航功能
2017/03/07 Javascript
使用vue-aplayer插件时出现的问题的解决
2018/03/02 Javascript
[01:03:47]VP vs NewBee Supermajor 胜者组 BO3 第一场 6.5
2018/06/06 DOTA
python修改list中所有元素类型的三种方法
2018/04/09 Python
Python实现爬虫设置代理IP和伪装成浏览器的方法分享
2018/05/07 Python
Pycharm 实现下一个文件引用另外一个文件的方法
2019/01/17 Python
Python实现合并excel表格的方法分析
2019/04/13 Python
Django Aggregation聚合使用方法解析
2019/08/01 Python
PyCharm2019安装教程及其使用(图文教程)
2019/09/29 Python
python实现控制台输出颜色
2021/03/02 Python
css3圆角边框和边框阴影示例
2014/05/05 HTML / CSS
成都思必达公司C#程序员招聘面试题
2013/06/26 面试题
初一体育教学反思
2014/01/29 职场文书
《风筝》教学反思
2014/04/10 职场文书
《大作家的小老师》教学反思
2014/04/16 职场文书
村抢险救灾方案
2014/05/09 职场文书
2014物价局群众路线对照检查材料思想汇报
2014/09/21 职场文书
离婚协议书范本2014
2014/10/27 职场文书
离婚协议书的范本
2015/01/27 职场文书
化妆品促销活动总结
2015/05/07 职场文书
工作计划范文之财务管理
2019/08/09 职场文书
导游词之绍兴柯岩古镇
2020/01/09 职场文书
pytorch 中autograd.grad()函数的用法说明
2021/05/12 Python
用Python仅20行代码编写一个简单的端口扫描器
2022/04/08 Python
Python实现批量将文件复制到新的目录中再修改名称
2022/04/12 Python