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模板,主要想体现一下思路
Dec 25 PHP
使用PHP实现蜘蛛访问日志统计
Jul 05 PHP
学习php中的正则表达式
Aug 17 PHP
如何让CI框架支持service层
Oct 29 PHP
PHP连接MSSQL方法汇总
Feb 05 PHP
PHP基本语法实例总结
Sep 09 PHP
PHP判断数组是否为空的常用方法(五种方法)
Feb 08 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
Jul 19 PHP
PHP使用XMLWriter读写xml文件操作详解
Jul 31 PHP
php策略模式简单示例分析【区别于工厂模式】
Sep 25 PHP
laravel-admin解决表单select联动时,编辑默认没选上的问题
Sep 30 PHP
PHP时间类完整代码实例
Feb 26 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
使用HMAC-SHA1签名方法详解
2013/06/26 PHP
PHP生成树的方法
2015/07/28 PHP
Yii CFileCache 获取不到值的原因分析
2017/02/08 PHP
PHP Socket网络操作类定义与用法示例
2017/08/30 PHP
让js弹出窗口居前显示的实现方法
2013/07/10 Javascript
js replace 与replaceall实例用法详解
2013/08/03 Javascript
JS延迟加载加快页面打开速度示例代码
2013/12/30 Javascript
JS长整型精度问题实例分析
2015/01/13 Javascript
使用HTML+CSS+JS制作简单的网页菜单界面
2015/07/27 Javascript
jquery+ajax请求且带返回值的代码
2015/08/12 Javascript
jQuery Validate验证框架经典大全
2015/09/23 Javascript
jQuery使用$.ajax进行即时验证的方法
2015/12/08 Javascript
使用three.js 画渐变的直线
2016/06/05 Javascript
探究Vue.js 2.0新增的虚拟DOM
2016/10/20 Javascript
JavaScript实现的select点菜功能示例
2017/01/16 Javascript
微信小程序开发入门基础教程
2017/04/19 Javascript
判断jQuery是否加载完成,没完成继续判断的解决方法
2017/12/06 jQuery
javascript实现最长公共子序列实例代码
2018/02/05 Javascript
js正则表达式校验指定字符串的方法
2018/07/23 Javascript
JavaScript深入V8引擎以及编写优化代码的5个技巧
2019/06/24 Javascript
js实现3D粒子酷炫动态旋转特效
2020/09/13 Javascript
Vue用mixin合并重复代码的实现
2020/11/27 Vue.js
[05:53]完美世界携手游戏风云打造 卡尔工作室观战系统篇
2013/04/22 DOTA
Python获取apk文件URL地址实例
2013/11/01 Python
Python之两种模式的生产者消费者模型详解
2018/10/26 Python
python 处理string到hex脚本的方法
2018/10/26 Python
win7 x64系统中安装Scrapy的方法
2018/11/18 Python
详解【python】str与json类型转换
2019/04/29 Python
Python Collatz序列实现过程解析
2019/10/12 Python
使用py-spy解决scrapy卡死的问题方法
2020/09/29 Python
Python通过format函数格式化显示值
2020/10/17 Python
使用CSS3来实现滚动视差效果的教程
2015/08/24 HTML / CSS
倩碧美国官网:Clinique美国
2016/07/20 全球购物
2016年庆祝六一儿童节活动总结
2016/04/06 职场文书
Python基础之常用库常用方法整理
2021/04/30 Python
SpringDataJPA在Entity中常用的注解介绍
2021/12/06 Java/Android