CI框架源码解读之利用Hook.php文件完成功能扩展的方法


Posted in PHP onMay 18, 2016

本文实例讲述了CI框架源码解读之利用Hook.php文件完成功能扩展的方法。分享给大家供大家参考,具体如下:

看了hook.php的源码,就知道CI使用hook来进行扩展的原理了。

hook的基本知识 http://codeigniter.org.cn/user_guide/general/hooks.html

CI中hook的使用经历了一个:开启hook,定义hook,调用hook,执行hook的过程。

手册中已经告知了开启、定义、调用的方法。那么hook的实现原理是啥呢。

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class CI_Hooks {
 var $enabled = FALSE; 
 //开启hook的标志,默认是关闭的。APPPATH/config/config.php中的配置也是默认关闭的,如果想使用hook,要在config.php中开启。
 var $hooks = array();
 //在_initialize()函数初始化的过程中将APPPATH/config/hook.php中定义的hook数组,引用到$this->hooks;
 var $in_progress  = FALSE;
 //当一个hook执行的时候,会给标记 $in_process = TRUE ,是为了防止同一个hook被同时调用。
 function __construct()
 {
  $this->_initialize();
  log_message('debug', "Hooks Class Initialized");
 }
 function _initialize()
 {
  //初始化hook
  //判断config.php中是否开启hook
  //include(hook.php),将文件里定义的hook数组引用到$this->hooks
  //$this->enable = TRUE 
 }
 function _call_hook($which = '')//pre_system
 {
  //以pre_system挂钩点为例,当调用_call_hook('pre_system')时
  //确保$this->enable = TRUE && 定义了$this->hooks['pre_system']
  //如果是二维数组就遍历,依次_run_hook($this->hooks['pre_system'][$val])
  //如果是一维数组,那么直接_run_hook($this->hooks['pre_system'])
 }
 function _run_hook($data) //$data 是传递过来的hook数组
 {
  //$data 就是我们在APPPATH/config/hook.php 定义的hook数组
  //$hook['pre_controller'] = array(
  // 'class'  => 'MyClass',
  // 'function' => 'Myfunction',
  // 'filename' => 'Myclass.php',
  // 'filepath' => 'hooks',
  // 'params'  => array('beer', 'wine', 'snacks')
  // );
  //取出data里面的数据,加载
  APPPATH.$data['filepath'].$data['filename'];
  //实例化钩子类,调用function。应用到示例中就是
  $this->in_process = TRUE;
  $Hook = new MyClass();
  $Hook->Myfunction($params);
  $this->in_process = FALSE;
  }
}
?>

挂钩点可以挂多个hook,所以,当我们想扩展ci的时候,只需要将hook文件放到APPPATH文件夹下,然后 到APPPATH/config/hook.php中声明定义的hook的信息即可。那么系统运行到挂钩点的时候,会自动调用声明的hook。

如此一来便实现了可扩展性

希望本文所述对大家基于CodeIgniter框架的PHP程序设计有所帮助。

PHP 相关文章推荐
用IE远程创建Mysql数据库的简易程序
Oct 09 PHP
PHP 数据结构 算法 三元组 Triplet
Jul 02 PHP
如何用phpmyadmin设置mysql数据库用户的权限
Jan 09 PHP
kohana框架上传文件验证规则写法示例
Jul 14 PHP
php定义参数数量可变的函数用法实例
Mar 16 PHP
php基于curl扩展制作跨平台的restfule 接口
May 11 PHP
Java中final关键字详解
Aug 10 PHP
thinkPHP中create方法与令牌验证实例浅析
Dec 08 PHP
PHP Try-catch 语句使用技巧
Feb 28 PHP
PHP链表操作简单示例
Oct 15 PHP
php tpl模板引擎定义与使用示例
Aug 09 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 PHP
CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析
May 18 #PHP
PHP正则表达式入门教程(推荐)
May 18 #PHP
CI框架AR操作(数组形式)实现插入多条sql数据的方法
May 18 #PHP
CI框架文件上传类及图像处理类用法分析
May 18 #PHP
CI框架实现cookie登陆的方法详解
May 18 #PHP
浅析php静态方法与非静态方法的用法区别
May 17 #PHP
php关闭warning问题的解决方法
May 17 #PHP
You might like
php通用防注入程序 推荐
2011/02/26 PHP
php中HTTP_REFERER函数用法实例
2014/11/21 PHP
ThinkPHP打水印及设置水印位置的方法
2016/10/14 PHP
PHP时间类完整代码实例
2021/02/26 PHP
JavaScript中Array 对象相关的几个方法
2006/12/22 Javascript
通过JAVASCRIPT读取ASP设定的COOKIE
2007/02/15 Javascript
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
2011/09/22 Javascript
jQuery 翻页组件yunm.pager.js实现div局部刷新的思路
2016/08/11 Javascript
使用微信内嵌H5网页解决JS倒计时失效问题
2017/01/13 Javascript
详解Angular.js指令中scope类型的几种特殊情况
2017/02/21 Javascript
JavaScript中 this 指向问题深度解析
2017/02/21 Javascript
JavaScript实现瀑布流图片效果
2017/06/30 Javascript
React组件refs的使用详解
2018/02/09 Javascript
解决iview打包时UglifyJs报错的问题
2018/03/07 Javascript
如何使用vuex实现兄弟组件通信
2018/11/02 Javascript
7个好用的JavaScript技巧分享(译)
2019/05/07 Javascript
javascript实现导航栏分页效果
2019/06/27 Javascript
JS获取当前时间的年月日时分秒及时间的格式化的方法
2019/12/18 Javascript
JavaScript判断数据类型有几种方法及区别介绍
2020/09/02 Javascript
Python中几种操作字符串的方法的介绍
2015/04/09 Python
python写程序统计词频的方法
2019/07/29 Python
python3 enum模块的应用实例详解
2019/08/12 Python
TensorBoard 计算图的可视化实现
2020/02/15 Python
python实现学生信息管理系统(精简版)
2020/11/27 Python
CSS3媒体查询Media Queries基础学习教程
2016/02/29 HTML / CSS
HTML5 Convas APIs方法详解
2015/04/24 HTML / CSS
HTML5在手机端实现视频全屏展示方法
2020/11/23 HTML / CSS
全球领先的鞋类零售商:The Walking Company
2016/07/21 全球购物
美国葡萄酒网上商店:Martha Stewart Wine Co.
2019/03/17 全球购物
牵手50新加坡:专为黄金岁月的单身人士而设的交友网站
2020/08/16 全球购物
幼儿园园务工作总结2015
2015/05/18 职场文书
2015年秋季运动会广播稿
2015/08/19 职场文书
2016优秀大学生个人事迹材料范文
2016/03/01 职场文书
python3实现无权最短路径的方法
2021/05/12 Python
关于EntityWrapper的in用法
2022/03/22 Java/Android
Python使用mitmproxy工具监控手机 下载手机小视频
2022/04/18 Python