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 相关文章推荐
深入理解PHP之require/include顺序 推荐
Jan 02 PHP
php中防止伪造跨站请求的小招式
Sep 02 PHP
php中http_build_query 的一个问题
Mar 25 PHP
PHP+jQuery 注册模块的改进(一):验证码存入SESSION
Oct 14 PHP
php魔术变量用法实例详解
Nov 13 PHP
php使用指定字符列表生成随机字符串的方法
Apr 18 PHP
使用ltrace工具跟踪PHP库函数调用的方法
Apr 25 PHP
PHP批量删除jQuery操作
Jul 23 PHP
使用composer命令加载vendor中的第三方类库 的方法
Jul 09 PHP
php扩展开发入门demo示例
Sep 23 PHP
php 中self,this的区别和操作方法实例分析
Nov 04 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
Feb 15 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下载文件源代码(强制任意文件格式下载)
2014/05/09 PHP
ThinkPHP标签制作教程
2014/07/10 PHP
Yii编程开发常见调用技巧集锦
2016/07/15 PHP
JQuery 解析多维的Json数据格式
2009/11/02 Javascript
jquery form表单提交插件asp.net后台中文解码
2010/06/12 Javascript
javascript中style.left和offsetLeft的用法说明
2014/03/07 Javascript
一个支持任意尺寸的图片上下左右滑动效果
2014/08/24 Javascript
js闭包的用途详解
2014/11/09 Javascript
ECMAScript6块级作用域及新变量声明(let)
2015/06/12 Javascript
基于jQuery和CSS3制作响应式水平时间轴附源码下载
2015/12/20 Javascript
浅谈JavaScript中变量和函数声明的提升
2016/08/09 Javascript
js前端日历控件(悬浮、拖拽、自由变形)
2017/03/02 Javascript
利用JS如何计算字符串所占字节数示例代码
2017/09/13 Javascript
jQuery实现checkbox即点即改批量删除及中间遇到的坑
2017/11/11 jQuery
vue添加axios,并且指定baseurl的方法
2018/09/19 Javascript
Angular+ionic实现折叠展开效果的示例代码
2020/07/29 Javascript
[07:09]2014DOTA2国际邀请赛-Newbee再次发威成功晋级决赛
2014/07/19 DOTA
[52:41]OG vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/20 DOTA
详解Python中find()方法的使用
2015/05/18 Python
Python基于最小二乘法实现曲线拟合示例
2018/06/14 Python
Python实现Linux监控的方法
2019/05/16 Python
详解基于Jupyter notebooks采用sklearn库实现多元回归方程编程
2020/03/25 Python
详解Python 中的容器 collections
2020/08/17 Python
Lombok插件安装(IDEA)及配置jar包使用详解
2020/11/04 Python
Python与C/C++的相互调用案例
2021/03/04 Python
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
CSS3使用transition属性实现过渡效果
2018/04/18 HTML / CSS
BONIA官方网站:国际奢侈品牌和皮革专家
2016/11/27 全球购物
全球速卖通:AliExpress(国际版淘宝)
2017/09/20 全球购物
Java程序员面试题
2016/09/27 面试题
高三体育教学反思
2014/01/29 职场文书
优秀学生评语大全
2014/04/25 职场文书
四风问题原因分析及整改措施
2014/10/24 职场文书
调研报告的主要写法
2019/04/18 职场文书
MySQL的join buffer原理
2021/04/29 MySQL
Python写情书? 10行代码展示如何把情书写在她的照片里
2022/04/21 Python