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的正则处理函数总结分析
Jun 20 PHP
PHP取得一个类的属性和方法的实现代码
May 22 PHP
php学习之function的用法
Jul 14 PHP
ThinkPHP之A方法实例讲解
Jun 20 PHP
thinkphp使用literal防止模板标签被解析的方法
Nov 22 PHP
详细解读PHP中接口的应用
Aug 12 PHP
PHP错误和异常处理功能模块示例
Nov 12 PHP
php中10个不同等级压缩优化图片操作示例
Nov 14 PHP
MAC下通过改apache配置文件切换php多版本的方法
Apr 26 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
Sep 19 PHP
Swoole源码中如何查询Websocket的连接问题详解
Aug 30 PHP
PHP控制循环操作的时间
Apr 01 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中余数、取余的妙用
2015/06/29 PHP
php有效防止同一用户多次登录
2015/11/19 PHP
thinkPHP5实现数据库添加内容的方法
2017/10/25 PHP
PHP getName()函数讲解
2019/02/03 PHP
我也种棵OO树JXTree[js+css+xml]
2007/04/02 Javascript
一个基于jquery的文本框记数器
2012/09/19 Javascript
网页右侧悬浮滚动在线qq客服代码示例
2014/04/28 Javascript
使用JS画图之点、线、面
2015/01/12 Javascript
JQuery中DOM事件绑定用法详解
2015/06/13 Javascript
利用jQuery及AJAX技术定时更新GridView的某一列数据
2015/12/04 Javascript
AngularJS中的包含详细介绍及实现示例
2016/07/28 Javascript
vue中使用sessionStorage记住密码功能
2018/07/24 Javascript
对angular 监控数据模型变化的事件方法$watch详解
2018/10/09 Javascript
Vue-router中hash模式与history模式的区别详解
2020/12/15 Vue.js
[02:53]DOTA2英雄基础教程 山岭巨人小小
2013/12/09 DOTA
[06:42]DOTA2每周TOP10 精彩击杀集锦vol.1
2014/06/25 DOTA
[01:01:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第一场 3月4日
2021/03/11 DOTA
Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程
2016/07/11 Python
用python制作游戏外挂
2018/01/04 Python
django ModelForm修改显示缩略图 imagefield类型的实例
2019/07/28 Python
python enumerate内置函数用法总结
2020/01/07 Python
python 实现aes256加密
2020/11/27 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
2021/01/27 Python
详解canvas drawImage()方法绘制图片不显示的问题
2018/10/08 HTML / CSS
工作失误检讨书(3篇)
2014/10/11 职场文书
先进个人评语大全
2015/01/04 职场文书
教学质量月活动总结
2015/05/11 职场文书
关于践行三严三实的心得体会
2016/01/05 职场文书
化工生产实习心得体会
2016/01/22 职场文书
2016年学校党支部公开承诺书
2016/03/25 职场文书
Mysql 如何批量插入数据
2021/04/06 MySQL
Python爬虫之爬取哔哩哔哩热门视频排行榜
2021/04/28 Python
教你用Python matplotlib库制作简单的动画
2021/06/11 Python
Apache Hudi数据布局黑科技降低一半查询时间
2022/03/31 Servers
Win11如何启用启动修复 ? Win11执行启动修复的三种方法
2022/04/08 数码科技
MySQL数据库实验之 触发器和存储过程
2022/06/21 MySQL