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 相关文章推荐
Get或Post提交值的非法数据处理
Oct 09 PHP
WML,Apache,和 PHP 的介绍
Oct 09 PHP
用PHP伪造referer突破网盘禁止外连的代码
Jun 15 PHP
PHP 根据IP地址控制访问的代码
Apr 22 PHP
php继承的一个应用
Sep 06 PHP
解析php框架codeigniter中如何使用框架的session
Jun 24 PHP
php中count获取多维数组长度的方法
Nov 03 PHP
php正则匹配html中带class的div并选取其中内容的方法
Jan 13 PHP
PHP之浮点数计算比较以及取整数不准确的解决办法
Jul 29 PHP
教你识别简单的免查杀PHP后门
Sep 13 PHP
微信公众平台DEMO(PHP)
May 04 PHP
thinkPHP自动验证、自动添加及表单错误问题分析
Oct 17 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
第四节--构造函数和析构函数
2006/11/16 PHP
php 静态页面中显示动态内容
2009/08/14 PHP
PHP函数之日期时间函数date()使用详解
2013/09/09 PHP
php实现的一段简单概率相关代码
2016/05/30 PHP
thinkphp配置文件路径的实现方法
2016/08/30 PHP
PHP获取input输入框中的值去数据库比较显示出来
2016/11/16 PHP
php实现微信公众号创建自定义菜单功能的实例代码
2019/06/11 PHP
JavaScript For Beginners(转载)
2007/01/05 Javascript
有关js的变量作用域和this指针的讨论
2010/12/16 Javascript
node.js中的console.warn方法使用说明
2014/12/09 Javascript
JS实现的通用表单验证插件完整实例
2015/08/20 Javascript
AngularJS中的API(接口)简单实现
2016/07/28 Javascript
js 获取图像缩放后的实际宽高,位置等信息
2017/03/07 Javascript
利用JS实现简单的瀑布流加载图片效果
2017/04/22 Javascript
详解Vue中状态管理Vuex
2017/05/11 Javascript
vue checkbox 全选 数据的绑定及获取和计算方法
2018/02/09 Javascript
解决vue路由后界面没有变化,但是链接有的问题
2018/09/01 Javascript
解决vue-cli项目开发运行时内存暴涨卡死电脑问题
2019/10/29 Javascript
[44:04]OG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
在Python中使用dict和set方法的教程
2015/04/27 Python
关于python列表增加元素的三种操作方法
2018/08/22 Python
Python3自动签到 定时任务 判断节假日的实例
2018/11/13 Python
Selenium+Python 自动化操控登录界面实例(有简单验证码图片校验)
2019/06/28 Python
python 函数中的内置函数及用法详解
2019/07/02 Python
Keras:Unet网络实现多类语义分割方式
2020/06/11 Python
Python用摘要算法生成token及检验token的示例代码
2020/12/01 Python
美国知名的百货清仓店:Neiman Marcus Last Call
2016/08/03 全球购物
李维斯法国官网:Levi’s法国
2019/07/13 全球购物
幼儿园教学随笔感言
2014/02/23 职场文书
《将心比心》教学反思
2014/04/08 职场文书
物理学专业求职信
2014/07/04 职场文书
树转促学习心得体会
2014/09/10 职场文书
2015纪念九一八事变84周年演讲稿
2015/03/19 职场文书
魂断蓝桥观后感
2015/06/10 职场文书
朋友圈早安励志语录!
2019/07/08 职场文书
mysql备份策略的实现(全量备份+增量备份)
2021/07/07 MySQL