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 相关文章推荐
做个自己站内搜索引擎
Oct 09 PHP
怎么样可以把 phpinfo()屏蔽掉?
Nov 24 PHP
PHP中限制IP段访问、禁止IP提交表单的代码
Apr 23 PHP
PHP中static关键字原理的学习研究分析
Jul 18 PHP
FireFox浏览器使用Javascript上传大文件
Oct 30 PHP
php cookie使用方法学习笔记分享
Nov 07 PHP
php准确计算复活节日期的方法
Apr 18 PHP
php中smarty区域循环的方法
Jun 11 PHP
PHP 接入微信扫码支付总结(总结篇)
Nov 03 PHP
PHP有序表查找之插值查找算法示例
Feb 10 PHP
PHP后台备份MySQL数据库的源码实例
Mar 18 PHP
php抽象类和接口知识点整理总结
Aug 02 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自定义函数之递归删除文件及目录
2010/08/08 PHP
解析PHP生成静态html文件的三种方法
2013/06/18 PHP
PHP设计模式之适配器模式代码实例
2015/05/11 PHP
typecho插件编写教程(五):核心代码
2015/05/28 PHP
今天你说520了吗?不仅有php表白书还有java表白神器
2016/05/20 PHP
web 页面分页打印的实现
2009/06/22 Javascript
javascript中substr,substring,slice.splice的区别说明
2010/11/25 Javascript
js如何获取object类型里的键值
2014/02/18 Javascript
js实现对table动态添加、删除和更新的方法
2015/02/10 Javascript
jQuery UI Bootstrap是什么?
2016/06/17 Javascript
微信小程序 动态的设置图片的高度和宽度详解及实例代码
2017/02/24 Javascript
打造通用的匀速运动框架(实例讲解)
2017/10/17 Javascript
使用node.js实现微信小程序实时聊天功能
2018/08/13 Javascript
AngularJS 事件发布机制
2018/08/28 Javascript
微信小程序使用wxParse解析html的实现示例
2018/08/30 Javascript
微信小程序使用GoEasy实现websocket实时通讯
2020/05/19 Javascript
Vue自动构建发布脚本的方法示例
2020/07/24 Javascript
Vue自定义全局弹窗组件操作
2020/08/11 Javascript
vue-resource 拦截器interceptors使用详解
2021/01/18 Vue.js
python执行外部程序的常用方法小结
2015/03/21 Python
Python实现的HTTP并发测试完整示例
2020/04/23 Python
深入学习Python中的装饰器使用
2016/06/20 Python
浅谈Python2.6和Python3.0中八进制数字表示的区别
2017/04/28 Python
基于Django用户认证系统详解
2018/02/21 Python
基于Python安装pyecharts所遇的问题及解决方法
2019/08/12 Python
opencv实现简单人脸识别
2021/02/19 Python
python实现复制大量文件功能
2019/08/31 Python
基于Python中isfile函数和isdir函数使用详解
2019/11/29 Python
求职简历中个人的自我评价
2013/12/25 职场文书
店长职务说明书
2014/02/04 职场文书
青年志愿者事迹材料
2014/02/07 职场文书
成人继续教育实施方案
2014/03/01 职场文书
大学优秀班主任事迹材料
2014/05/02 职场文书
2014年组织部工作总结
2014/11/14 职场文书
2016年校长新年寄语
2015/08/17 职场文书
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
2021/06/08 Python