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 相关文章推荐
用DBSQL类加快开发MySQL数据库程序的速度
Oct 09 PHP
php读取msn上的用户信息类
Dec 05 PHP
php 魔术函数使用说明
Feb 21 PHP
php下用cookie统计用户访问网页次数的代码
May 09 PHP
比较discuz和ecshop的截取字符串函数php版
Sep 03 PHP
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
Dec 25 PHP
利用PHP函数计算中英文字符串长度的方法
Nov 11 PHP
初识ThinkPHP控制器
Apr 07 PHP
PHP+Mysql无刷新问答评论系统(源码)
Dec 20 PHP
php写app接口并返回json数据的实例(分享)
May 20 PHP
PHP+Apache实现二级域名之间共享cookie的方法
Jul 24 PHP
Thinkphp 框架扩展之应用模式实现方法分析
Apr 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的计数器程序
2006/10/09 PHP
社区(php&amp;&amp;mysql)三
2006/10/09 PHP
php 动态添加记录
2009/03/10 PHP
php数字每三位加逗号的功能函数
2015/10/22 PHP
Yii全局函数用法示例
2017/01/22 PHP
php pdo操作数据库示例
2017/03/10 PHP
PHP更安全的密码加密机制Bcrypt详解
2017/06/18 PHP
写出更好的JavaScript之undefined篇(上)
2009/11/22 Javascript
js去除重复字符串两种实现方法
2013/01/09 Javascript
JavaScript中实现单体模式分享
2015/01/29 Javascript
jQuery实现点击小图片淡入淡出显示大图片特效
2015/09/09 Javascript
跟我学习javascript的作用域与作用域链
2015/11/19 Javascript
js获取元素的标签名实现方法
2016/10/08 Javascript
jquery购物车结算功能实现方法
2020/10/29 Javascript
使用AngularJS2中的指令实现按钮的切换效果
2017/03/27 Javascript
利用n工具轻松管理Node.js的版本
2017/04/21 Javascript
jQuery菜单实例(全选,反选,取消)
2017/08/28 jQuery
vue-router 组件复用问题详解
2018/01/22 Javascript
vue路由跳转传参数的方法
2019/05/06 Javascript
vue路由守卫及路由守卫无限循环问题详析
2019/09/05 Javascript
JS实现随机抽选获奖者
2019/11/07 Javascript
JS通用方法触发点击事件代码实例
2020/02/17 Javascript
JS script脚本中async和defer区别详解
2020/06/24 Javascript
Python实现的金山快盘的签到程序
2013/01/17 Python
python中的全局变量用法分析
2015/06/09 Python
详解python eval函数的妙用
2017/11/16 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
2020/04/15 Python
golang/python实现归并排序实例代码
2020/08/30 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
2021/02/07 Python
使用canvas对多图片拼合并导出图片的方法
2018/08/28 HTML / CSS
Under Armour西班牙官网:美国知名的高端功能性运动品牌
2018/12/12 全球购物
strstr()的简单实现
2013/09/26 面试题
设备收款委托书范本
2014/10/02 职场文书
银行求职信模板
2015/03/20 职场文书
一文搞懂php的垃圾回收机制
2021/06/18 PHP
Java字符缓冲流BufferedWriter
2022/04/09 Java/Android