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扩展ZF――Validate扩展
Jan 10 PHP
PHP开发过程中常用函数收藏
Dec 14 PHP
PHP下操作Linux消息队列完成进程间通信的方法
Jul 24 PHP
phpstrom使用xdebug配置方法
Dec 17 PHP
PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
Jun 12 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
Jul 22 PHP
PHP中array_slice函数用法实例详解
Nov 25 PHP
thinkphp数据查询和遍历数组实例
Nov 28 PHP
PHP数组相关函数汇总
Mar 24 PHP
PHP常用的小程序代码段
Nov 14 PHP
php+redis实现多台服务器内网存储session并读取示例
Jan 12 PHP
Laravel学习教程之IOC容器的介绍与用例
Aug 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
js 目录列举函数
2008/11/06 Javascript
js模仿windows桌面图标排列算法具体实现(附图)
2013/06/16 Javascript
使用Node.js实现一个简单的FastCGI服务器实例
2014/06/09 Javascript
node.js中的fs.chmodSync方法使用说明
2014/12/18 Javascript
JavaScript设计模式之建造者模式介绍
2014/12/28 Javascript
jQuery匹配文档链接并添加class的方法
2015/06/26 Javascript
jQuery幻灯片特效代码分享--鼠标滑过按钮时切换(2)
2020/11/18 Javascript
JS实现可关闭的对联广告效果代码
2015/09/14 Javascript
javascript实现加载xml文件的方法
2015/11/24 Javascript
基于javascript显示当前时间以及倒计时功能
2016/03/18 Javascript
jQuery实现鼠标经过显示动画边框特效
2017/03/24 jQuery
vue的Virtual Dom实现snabbdom解密
2017/05/03 Javascript
JavaScript 程序错误Cannot use 'in' operator to search的解决方法
2017/07/10 Javascript
JQuery插件tablesorter表格排序实现过程解析
2020/05/28 jQuery
pyqt4教程之messagebox使用示例分享
2014/03/07 Python
解决Python字典写入文件出行首行有空格的问题
2017/09/27 Python
python3.0 模拟用户登录,三次错误锁定的实例
2017/11/02 Python
python进行两个表格对比的方法
2018/06/27 Python
python3.6中@property装饰器的使用方法示例
2019/08/17 Python
Django框架 信号调度原理解析
2019/09/04 Python
Python实现播放和录制声音的功能
2020/08/12 Python
python map比for循环快在哪
2020/09/21 Python
calendar在python3时间中常用函数举例详解
2020/11/18 Python
高中毕业生自我鉴定
2013/11/03 职场文书
教师职称自我鉴定
2014/02/12 职场文书
四下基层实施方案
2014/03/28 职场文书
充分就业社区汇报材料
2014/05/07 职场文书
敬老院献爱心活动总结
2014/07/08 职场文书
医院我们的节日活动实施方案
2014/08/22 职场文书
党员批评与自我批评思想汇报
2014/10/08 职场文书
董事长年会致辞
2015/07/29 职场文书
员工试用期工作总结
2019/06/20 职场文书
《艾尔登法环》发布最新「战技」宣传片
2022/04/03 其他游戏
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/07 其他游戏
vue报错function () { [native code] },无法出现我们想要的内容 Unknown custom element
2022/04/11 Vue.js
MySQL常用慢查询分析工具详解
2022/08/14 MySQL