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 相关文章推荐
模仿OSO的论坛(五)
Oct 09 PHP
PHP的分页功能
Mar 21 PHP
php使用array_rand()函数从数组中随机选择一个或多个元素
Apr 28 PHP
浅谈php冒泡排序
Dec 30 PHP
Zend Framework教程之模型Model基本规则和使用方法
Mar 04 PHP
深入剖析PHP中printf()函数格式化使用
May 23 PHP
PHP自定义函数格式化json数据示例
Sep 14 PHP
PHP实现权限管理功能示例
Sep 22 PHP
PHPUnit测试私有属性和方法功能示例
Jun 12 PHP
Thinkphp 5.0实现微信企业付款到零钱
Sep 30 PHP
php连接sftp的作用以及实例代码
Sep 23 PHP
PHP手机号码及邮箱正则表达式实例解析
Jul 11 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 图片处理
2020/09/16 PHP
PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)
2020/10/30 PHP
自己开发Dojo的建议框架
2008/09/24 Javascript
让任务管理器中的CPU跳舞的js代码
2008/11/01 Javascript
web前端开发也需要日志
2010/12/09 Javascript
[原创]推荐10款最热门jQuery UI框架
2014/08/19 Javascript
JS设置网页图片vspace和hspace属性的方法
2015/04/01 Javascript
js+css实现文字散开重组动画特效代码分享
2015/08/21 Javascript
基于jquery实现可定制的web在线富文本编辑器附源码下载
2015/11/17 Javascript
js禁止浏览器的回退事件
2017/04/20 Javascript
怎样使你的 JavaScript 代码简单易读(推荐)
2019/04/16 Javascript
使用vue制作滑动标签
2019/09/21 Javascript
javascript实现fetch请求返回的统一拦截
2019/12/22 Javascript
vue在线动态切换主题色方案
2020/03/26 Javascript
bootstrap实现tab选项卡切换
2020/08/09 Javascript
[02:50]【扭转乾坤,只此一招】DOTA2全新版本永雾林渊开启新篇章
2020/12/24 DOTA
浅谈python对象数据的读写权限
2016/09/12 Python
python中模块查找的原理与方法详解
2017/08/11 Python
Django认证系统实现的web页面实现代码
2019/08/12 Python
python字符串判断密码强弱
2020/03/18 Python
Python接口开发实现步骤详解
2020/04/26 Python
django ORM之values和annotate使用详解
2020/05/19 Python
python 利用matplotlib在3D空间中绘制平面的案例
2021/02/06 Python
Python基于爬虫实现全网搜索并下载音乐
2021/02/14 Python
美国网上购买眼镜:Eyeconic
2017/07/29 全球购物
香港唯港荟酒店预订:Hotel ICON
2018/03/27 全球购物
美国专业消费电子及摄影器材网站:B&H Photo Video
2019/12/18 全球购物
TCP/IP中的TCP和IP分别承担什么责任
2012/04/21 面试题
青年创业培训欢迎词
2014/01/08 职场文书
表扬信格式
2014/01/12 职场文书
《一个小村庄的故事》教学反思
2014/04/13 职场文书
大学生社会实践方案
2014/05/11 职场文书
学生穿着不得体检讨书
2014/10/12 职场文书
2019年年中职场激励人心语录30条
2019/08/07 职场文书
Vue+Flask实现图片传输功能
2022/04/01 Vue.js
Redis实现订单过期删除的方法步骤
2022/06/05 Redis