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 相关文章推荐
让你同时上传 1000 个文件 (一)
Oct 09 PHP
PHPWind 发帖回帖Api PHP版打包下载
Feb 08 PHP
Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
Jul 23 PHP
深入php list()函数的详解
Jun 05 PHP
php加密算法之实现可逆加密算法和解密分享
Jan 21 PHP
php根据isbn书号查询amazon网站上的图书信息的示例
Feb 13 PHP
php实现的单一入口应用程序实例分析
Sep 23 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
Feb 14 PHP
将PHP的session数据存储到数据库中的代码实例
Jun 24 PHP
Centos PHP 扩展Xchche的安装教程
Jul 09 PHP
Yii使用smsto短信接口的函数demo示例
Jul 13 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
Apr 19 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下载远程图片函数 可伪造来路
2013/06/25 PHP
体育彩票排列三组选三算法分享
2014/03/07 PHP
php结合js实现点击超链接执行删除确认操作
2014/10/31 PHP
yii2中添加验证码的实现方法
2016/01/09 PHP
Yii2.0 模态弹出框+ajax提交表单
2016/05/22 PHP
微信 开发生成带参数的二维码的实例
2016/11/23 PHP
让Firefox支持event对象实现代码
2009/11/07 Javascript
初窥JQuery-Jquery简介 入门了解篇
2010/11/25 Javascript
3分钟写出来的Jquery版checkbox全选反选功能
2013/10/23 Javascript
JS操作CSS随机改变网页背景实现思路
2014/03/10 Javascript
JS小游戏之象棋暗棋源码详解
2014/09/25 Javascript
node.js中的fs.ftruncate方法使用说明
2014/12/15 Javascript
JavaScript类的写法
2016/09/17 Javascript
jQuery实现圣诞节礼物传送(花式轮播)
2016/12/25 Javascript
详解webpack解惑:require的五种用法
2017/06/09 Javascript
jQuery插件artDialog.js使用与关闭方法示例
2017/10/09 jQuery
Koa 使用小技巧(小结)
2018/10/22 Javascript
使用 Vue 实现一个虚拟列表的方法
2019/08/20 Javascript
java和js实现的洗牌小程序
2019/09/30 Javascript
小程序富文本提取图片可放大缩小
2020/05/26 Javascript
JavaScript 闭包的使用场景
2020/09/17 Javascript
在python中利用GDAL对tif文件进行读写的方法
2018/11/29 Python
如何在django里上传csv文件并进行入库处理的方法
2019/01/02 Python
使用python的pexpect模块,实现远程免密登录的示例
2019/02/14 Python
python解析命令行参数的三种方法详解
2019/11/29 Python
Python 多线程共享变量的实现示例
2020/04/17 Python
如何利用Python识别图片中的文字
2020/05/31 Python
详解H5 活动页之移动端 REM 布局适配方法
2017/12/07 HTML / CSS
Qoo10台湾站:亚洲领先的在线市场
2018/05/15 全球购物
建筑施工实习自我鉴定
2013/09/19 职场文书
合作意向书模板
2014/03/31 职场文书
介绍信格式
2015/01/30 职场文书
2015年学校安全管理工作总结
2015/05/11 职场文书
城南旧事读书笔记
2015/06/29 职场文书
导游词之镇江焦山
2019/11/21 职场文书
基于HTML十秒做出淘宝页面
2021/10/24 HTML / CSS