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模板技术原理【一】
Jan 10 PHP
PHP中的integer类型使用分析
Jul 27 PHP
php 操作调试的方法
Jul 12 PHP
php截取字符串并保留完整xml标签的函数代码
Feb 06 PHP
比较简单的百度网盘文件直链PHP代码
Mar 24 PHP
PHP中$_SERVER使用说明
Jul 05 PHP
关于php中的json_encode()和json_decode()函数的一些说明
Nov 20 PHP
简单解决微信文章图片防盗链问题
Dec 17 PHP
php提交表单时保留多个空格及换行的文本样式的方法
Jun 20 PHP
PHP ADODB生成HTML表格函数rs2html功能【附错误处理函数用法】
May 29 PHP
Laravel timestamps 设置为unix时间戳的方法
Oct 11 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
May 29 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
在JavaScript中遭遇级联表达式陷阱
2007/03/08 Javascript
window.location.reload()方法刷新页面弹出要再次显示该网页对话框
2013/04/24 Javascript
jquery 页眉单行信息滚动显示实现思路及代码
2014/06/26 Javascript
使用typeof判断function是否存在于上下文
2014/08/14 Javascript
jquery获取复选框checkbox的值的简单实现方法
2016/05/26 Javascript
NodeJS使用formidable实现文件上传
2016/10/27 NodeJs
微信小程序加载更多 点击查看更多
2016/11/29 Javascript
深入浅析Vue.js中 computed和methods不同机制
2018/03/22 Javascript
jQuery基于闭包实现的显示与隐藏div功能示例
2018/06/09 jQuery
解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题
2019/10/27 Javascript
9个JavaScript日常开发小技巧
2020/10/06 Javascript
ant design 日期格式化的实现
2020/10/27 Javascript
浅谈es6中的元编程
2020/12/01 Javascript
[04:11]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/01/30 DOTA
Python中的zipfile模块使用详解
2015/06/25 Python
Python随机生成数据后插入到PostgreSQL
2016/07/28 Python
python批量复制图片到另一个文件夹
2018/09/17 Python
python实现n个数中选出m个数的方法
2018/11/13 Python
Python函数的参数常见分类与用法实例详解
2019/03/30 Python
python 计算方位角实例(根据两点的坐标计算)
2020/01/17 Python
pytorch dataloader 取batch_size时候出现bug的解决方式
2020/02/20 Python
VSCode配合pipenv搞定虚拟环境的实现方法
2020/05/17 Python
matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)
2021/02/22 Python
香港太阳眼镜网上商店:SmartBuyGlasses香港
2016/07/22 全球购物
巴西电子、家电、智能手机购物网站:Girafa
2019/06/04 全球购物
亚洲最大的运动鞋寄售店:KicksCrew
2020/11/26 全球购物
与UNIX有关的几个名词
2015/09/17 面试题
护士自荐信
2013/10/25 职场文书
关于责任的演讲稿
2014/05/20 职场文书
三好生演讲稿
2014/09/12 职场文书
标准版离职证明书
2014/09/12 职场文书
赵乐秦在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
班级管理经验交流材料
2015/11/02 职场文书
浪漫婚礼主持词开场白
2015/11/24 职场文书
css 中多种边框的实现小窍门
2021/04/07 HTML / CSS
使用Springboot实现健身房管理系统
2021/07/01 Java/Android