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 相关文章推荐
计数器详细设计
Oct 09 PHP
PHP4实际应用经验篇(2)
Oct 09 PHP
PHP中include()与require()的区别说明
Mar 10 PHP
PHP读取txt文件的内容并赋值给数组的代码
Nov 03 PHP
php curl基本操作详解
Jul 23 PHP
php获取汉字首字母的函数
Nov 07 PHP
php实现curl模拟ftp上传的方法
Jul 29 PHP
php通过文件头判断格式的方法
May 28 PHP
php reset() 函数指针指向数组中的第一个元素并输出实例代码
Nov 21 PHP
yii2项目实战之restful api授权验证详解
May 20 PHP
php检测mysql表是否存在的方法小结
Jul 20 PHP
PHP实现的简单sha1加密功能示例
Aug 27 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获取网卡地址的代码
2008/04/09 PHP
用 Composer构建自己的 PHP 框架之基础准备
2014/10/30 PHP
YII Framework框架教程之日志用法详解
2016/03/14 PHP
PHP二维数组去重算法
2016/12/17 PHP
PHP simplexml_load_file()函数讲解
2019/02/03 PHP
PHP 观察者模式深入理解与应用分析
2019/09/25 PHP
Laravel统计一段时间间隔的数据方法
2019/10/09 PHP
js实现运行代码需要刷新的解决方法
2007/08/18 Javascript
帮助避免错误的Javascript陷阱清单
2009/05/31 Javascript
基于jquery的一个图片hover的插件
2010/04/24 Javascript
使用原生javascript创建通用表单验证——更锋利的使用dom对象
2011/09/13 Javascript
Jquery EasyUI中弹出确认对话框以及加载效果示例代码
2014/02/13 Javascript
跟我学习javascript的垃圾回收机制与内存管理
2015/11/23 Javascript
Bootstrap的Refresh Icon也spin起来
2016/07/13 Javascript
vue 1.0 结合animate.css定义动画效果
2018/07/11 Javascript
webpack+vue-cil中proxyTable处理跨域的方法
2018/07/20 Javascript
JavaScript 九种跨域方式实现原理
2019/02/11 Javascript
JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法分析
2019/05/22 Javascript
React传值 组件传值 之间的关系详解
2019/08/26 Javascript
浅谈对于“不用setInterval,用setTimeout”的理解
2019/08/28 Javascript
基于layui内置模块(element常用元素的操作)
2019/09/20 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
jQuery三组基本动画与自定义动画操作实例总结
2020/05/09 jQuery
[03:39]这就是刀塔,我们是冠军!燃情短片讲述我们的DOTA故事
2019/07/02 DOTA
python根据出生日期获得年龄的方法
2015/03/31 Python
Python选择排序、冒泡排序、合并排序代码实例
2015/04/10 Python
在Python的web框架中配置app的教程
2015/04/30 Python
Python数据库的连接实现方法与注意事项
2016/02/27 Python
python爬虫 使用真实浏览器打开网页的两种方法总结
2018/04/21 Python
python3.x 生成3维随机数组实例
2019/11/28 Python
keras获得某一层或者某层权重的输出实例
2020/01/24 Python
python 模拟登陆github的示例
2020/12/04 Python
寻找完美的房车租赁:RVShare
2019/02/23 全球购物
俄罗斯美容和健康网上商店:Созвездие Красоты
2019/07/23 全球购物
2015年幼儿园德育工作总结
2015/05/25 职场文书
前端vue+express实现文件的上传下载示例
2022/02/18 Vue.js