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新手谈谈我的学习心得
Feb 25 PHP
apache和php之间协同工作的配置经验分享
Apr 08 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
Dec 24 PHP
php通过curl模拟登陆DZ论坛
May 11 PHP
WampServer搭建php环境时遇到的问题汇总
Jul 23 PHP
PHP内核学习教程之php opcode内核实现
Jan 27 PHP
PHP 芝麻信用接入的注意事项
Dec 01 PHP
php实现的XML操作(读取)封装类完整实例
Feb 23 PHP
PHP开发之用微信远程遥控服务器
Jan 25 PHP
浅析PHP类的反射来实现依赖注入过程
Feb 06 PHP
PHP重置数组为连续数字索引的几种方式总结
Mar 12 PHP
PHP如何使用cURL实现Get和Post请求
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网页游戏学习之Xnova(ogame)源码解读(二)
2014/06/23 PHP
PHP绕过open_basedir限制操作文件的方法
2018/06/10 PHP
PHP使用phpunit进行单元测试示例
2019/09/23 PHP
JS获取IP、MAC和主机名的五种方法
2013/11/14 Javascript
Js和JQuery获取鼠标指针坐标的实现代码分享
2015/05/25 Javascript
使用jQuery获取data-的自定义属性
2015/11/10 Javascript
jQuery自定义滚动条完整实例
2016/01/08 Javascript
20分钟轻松创建自己的Bootstrap站点
2016/05/12 Javascript
JavaScript+Java实现HTML页面转为PDF文件保存的方法
2016/05/30 Javascript
D3.js实现柱状图的方法详解
2016/09/21 Javascript
nodejs批量下载图片的实现方法
2017/05/19 NodeJs
深入理解Vuex 模块化(module)
2017/09/26 Javascript
vue2.0 路由不显示router-view的解决方法
2018/03/06 Javascript
vue2.0 自定义组件的方法(vue组件的封装)
2018/06/05 Javascript
微信小程序单选radio及多选checkbox按钮用法示例
2019/04/30 Javascript
详解微信小程序胶囊按钮返回|首页自定义导航栏功能
2019/06/14 Javascript
vue表单中遍历表单操作按钮的显示隐藏示例
2019/10/30 Javascript
jQuery实现消息弹出框效果
2019/12/10 jQuery
node.js如何操作MySQL数据库
2020/10/29 Javascript
vue+elementUI中表格高亮或字体颜色改变操作
2020/11/02 Javascript
JavaScript如何实现防止重复的网络请求的示例
2021/01/28 Javascript
Python中利用原始套接字进行网络编程的示例
2015/05/04 Python
在Django框架中编写Context处理器的方法
2015/07/20 Python
Django的HttpRequest和HttpResponse对象详解
2018/01/26 Python
python通过百度地图API获取某地址的经纬度详解
2018/01/28 Python
matplotlib subplots 调整子图间矩的实例
2018/05/25 Python
Python Tkinter模块实现时钟功能应用示例
2018/07/23 Python
python实现自动化上线脚本的示例
2019/07/01 Python
Pandas替换及部分替换(replace)实现流程详解
2020/10/12 Python
linux下进程间通信的方式
2014/12/23 面试题
中专三年学习的个人自我评价
2013/12/12 职场文书
最热门的自我评价
2013/12/30 职场文书
2015年国庆节寄语
2015/08/17 职场文书
浅谈Python协程asyncio
2021/06/20 Python
三星 3nm 芯片将于第二季度开始量产
2022/04/29 数码科技
ConditionalOnProperty配置swagger不生效问题及解决
2022/06/14 Java/Android