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下的权限算法的实现
Apr 28 PHP
php中使用DOM类读取XML文件的实现代码
Dec 14 PHP
PHP中call_user_func_array()函数的用法演示
Feb 05 PHP
定义php常量的详解
Jun 09 PHP
PHP导航下拉菜单的实现如此简单
Sep 22 PHP
php的SimpleXML方法读写XML接口文件实例解析
Jun 16 PHP
php简单获取文件扩展名的方法
Mar 24 PHP
Zend Framework实现多文件上传功能实例
Mar 21 PHP
Zend Framework分页类用法详解
Mar 22 PHP
基于jQueryUI和Corethink实现百度的搜索提示功能
Nov 09 PHP
PHP magento后台无法登录问题解决方法
Nov 24 PHP
在php的yii2框架中整合hbase库的方法
Sep 20 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多线程之内部多线程实例分析
2015/03/09 PHP
浅谈PHP值mysql操作类
2016/06/29 PHP
PHP那些琐碎的知识点(整理)
2017/05/20 PHP
PHP长网址与短网址的实现方法
2017/10/13 PHP
phpstudy后门rce批量利用脚本的实现
2019/12/12 PHP
jQuery 锚点跳转滚动条平滑滚动一句话代码
2010/04/30 Javascript
picChange 图片切换特效的函数代码
2010/05/06 Javascript
自制的文件上传JS控件可支持IE、chrome、firefox etc
2014/04/18 Javascript
使用npm发布Node.JS程序包教程
2015/03/02 Javascript
jQuery实现简单的列表式导航菜单效果代码
2015/08/31 Javascript
JavaScript希尔排序、快速排序、归并排序算法
2016/05/08 Javascript
JQuery组件基于Bootstrap的DropDownList(完整版)
2016/07/05 Javascript
通过函数作用域和块级作用域看javascript的作用域链
2018/08/05 Javascript
详解mpvue小程序中怎么引入iconfont字体图标
2018/10/01 Javascript
2019 年编写现代 JavaScript 代码的5个小技巧(小结)
2019/01/15 Javascript
基于vue开发微信小程序mpvue-docs跳转页面功能
2019/04/10 Javascript
微信小程序云开发如何使用云函数生成二维码
2019/05/18 Javascript
layUI实现前端分页和后端分页
2019/07/27 Javascript
原生js实现随机点餐效果
2019/12/10 Javascript
Python基于递归算法实现的汉诺塔与Fibonacci数列示例
2018/04/18 Python
python 以16进制打印输出的方法
2018/07/09 Python
Python字符串的一些操作方法总结
2019/06/10 Python
这可能是最好玩的python GUI入门实例(推荐)
2019/07/19 Python
python基础 range的用法解析
2019/08/23 Python
python爬虫之爬取百度音乐的实现方法
2019/08/24 Python
Python unittest如何生成HTMLTestRunner模块
2020/09/08 Python
德国领先的大尺码和超大尺码男装在线零售商:Bigtex
2019/06/22 全球购物
Haggar官网:美国男装品牌
2020/02/16 全球购物
温泉秘密:Onsen Secret
2020/07/06 全球购物
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类
2012/02/06 面试题
公司部门司机岗位职责
2014/01/03 职场文书
七年级生物教学反思
2014/01/30 职场文书
应届毕业生简历自我评价
2014/01/31 职场文书
市场营销个人求职信范文
2014/02/02 职场文书
2014年党务工作总结
2014/11/25 职场文书
Vue提供的三种调试方式你知道吗
2022/01/18 Vue.js