CI框架源码研读(整体架构)
有人说phper的深入要从研读mvc框架开始,我跳了一个常用的CI框架入手,主要是因为 CI框架简单轻巧,可以自己DIY功能!!!
1、首先来看CI的整体架构图:

其中:application是用户级开发目录,我们关心system系统源码目录,CI的核心代码都在这里了。
1、core 系统核心代码
2、database数据库相关的操作和帮助类
3、helpers 系统提供的一些工具类
4、language 语言包
5、libraries 系统依赖类
2、CI的代码流程

我们初次访问CI的时候进入的welcome页面,那么这个welcome的页面请求都经过了哪些地方呢,我们来追踪一下。
所以对ci的请求,都是首先进入index.php文件。在index.php文件中进行CI框架的初始化操作,
define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development');
define('SELF', pathinfo(__FILE__, PATHINFO_BASENAME));
define('BASEPATH', $system_path);
define('FCPATH', dirname(__FILE__).DIRECTORY_SEPARATOR);
define('SYSDIR', basename(BASEPATH));
define('APPPATH', $application_folder.DIRECTORY_SEPARATOR);
define('VIEWPATH', $view_folder.DIRECTORY_SEPARATOR);
require_once BASEPATH.'core/CodeIgniter.php';
在index.php文件中定义了必要的全局变量,最后引入了core/CodeIgniter.php核心类。那我们追踪到core/CodeIgniter.php中,文件中首先引入了:
require_once(APPPATH.'config/constants.php'); require_once(BASEPATH.'core/Common.php');
之后又实例化了 Benchmark、Hooks、Config、Log、Utf8、URI、Router、Output、Security、Input、Lang 类,引入是调用common.php中的load_class方法实现的。
$class = ucfirst($RTR->class); $method = $RTR->method;
在路由中提取出对应要调用的class和method,然后实例化class且调用方法:
$CI = new $class(); call_user_func_array(array(&$CI, $method), $params);
其前后调用了四个钩子:
$EXT->call_hook('pre_controller');
$EXT->call_hook('post_controller_constructor');
$EXT->call_hook('post_controller');
$EXT->call_hook('post_system');
这里解析出的class和method,其实就是Welcome和index,之后我们 进入application/controllers/Welcome.php类后发现,类里只有
public function index(){
$this->load->view('welcome_message');
}
简单的 加载模板方法,我们看到Welcome 类继承自父类:CI_Controller
我们进入CI_Controller类中查看:
public function __construct(){
self::$instance =& $this;
foreach (is_loaded() as $var => $class){
$this->$var =& load_class($class);
}$this->load =& load_class('Loader', 'core');
$this->load->initialize();
log_message('info', 'Controller Class Initialized');
}
这段构造函数是将,在引导类CodeIgniter.php被实例化化的类赋值到本地类变量中,以构造一个超级对象被使用。同时实现了一个单例 公外部调用。
那是如何赋值的那,这里调用了 common类 中的is_loader()方法。其实就是返回的我们在上面
调用load_class()加载过的类:

最后初始化成功后,会执行CodeIgniter.php文件中的:
call_user_func_array(array(&$CI, $method), $params);
这个函数,从而进入我们welcome控制器的index方法。
大致的流程就是如此,可以根据自己的想法去实现功能,开发有意思的功能模块!!!!
CI框架源码研读(整体架构)的更多相关文章
- MyBatis 源码篇-整体架构
MyBatis 的整体架构分为三层, 分别是基础支持层.核心处理层和接口层,如下图所示. 基础支持层 反射模块 该模块对 Java 原生的反射进行了良好的封装,提供了更加简洁易用的 API ,方便上层 ...
- CI框架源码阅读笔记5 基准测试 BenchMark.php
上一篇博客(CI框架源码阅读笔记4 引导文件CodeIgniter.php)中,我们已经看到:CI中核心流程的核心功能都是由不同的组件来完成的.这些组件类似于一个一个单独的模块,不同的模块完成不同的功 ...
- CI框架源码阅读笔记4 引导文件CodeIgniter.php
到了这里,终于进入CI框架的核心了.既然是“引导”文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http://you.host.c ...
- CI框架源码阅读笔记3 全局函数Common.php
从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap ...
- CI框架源码阅读笔记2 一切的入口 index.php
上一节(CI框架源码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程,这里再次贴出流程图,以备参考: 作为CI框架的入口文件,源码阅读,自然由此开始.在源码阅读的过程中, ...
- CI框架源码阅读笔记1 - 环境准备、基本术语和框架流程
最开始使用CI框架的时候,就打算写一个CI源码阅读的笔记系列,可惜虎头蛇尾,一直没有行动.最近项目少,总算是有了一些时间去写一些东西.于是准备将之前的一些笔记和经验记录下来,一方面权作备忘,另一方面时 ...
- Fresco 源码分析 —— 整体架构
Fresco 是我们项目中图片加载专用框架.虽然我不是负责 Fresco 框架,但是由本人负责组里的图片加载浏览等工作,因此了解 Fresco 的源码有助于我今后的工作,也可以学习 Fresco 的源 ...
- 【深入浅出jQuery】源码浅析--整体架构
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- 【深入浅出jQuery】源码浅析--整体架构(转)
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
随机推荐
- [转]微信小程序-template模板使用
本文转自:http://blog.csdn.net/u013778905/article/details/59646241 如下图,我在做华企商学院小程序的时候,课程搜索结果页和课程列表页结构是完全一 ...
- 一:HttpClient知识整理
一:httpclient 简介 HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支 ...
- The Struts dispatcher cannot be found. This is usually caused by using Struts tags without the associated filter.
The Struts dispatcher cannot be found. This is usually caused by using Struts tags without the assoc ...
- 插入排序——Python实现
一.排序思想 排序思想参见:https://www.cnblogs.com/luomeng/p/10583124.html 二.python实现 def InsertSort(arrs): " ...
- Maven pom.xml 常用打包配置
<build> <!-- 指定JAVA源文件目录 --> <sourceDirectory>src</sourceDirectory> <!-- ...
- java.io.FileNotFoundException
1. 概述 上传图片到 o:/mmfiles_2017/39973/25444/333.jpg目录下 目录不存在会报标题中的错误 必须先创建目录 2. 方法 File filePath = new F ...
- CSS 2D转换
转换是使元素改变形状.尺寸和位置的一种效果.通过 CSS3 转换,我们能够对元素进行移动.缩放.转动.拉长或拉伸,可以大致分为2D转换和3D转换.下面介绍的是2D转换的相关知识点. 首先,CSS中2D ...
- UNIX/Linux系统管理技术手册(3)----bash 数组和算术运算
复杂的数据结构和计算不是 bash 的特长.但它的确至少提供了数组和算术运算. 1.算术运算 所有的 bash 变量的值都是字符串,所以 bash 在赋值的时候并不区分数字 1 和 字符串 " ...
- 【Python】猜数小游戏(文件操作)
人生苦短,我用Python 关键词 1.多用户 2.字典记录所有成绩 3.每次游戏轮数&总游戏次数&平均每次游戏需要多少轮 字典Dictionary.列表List.元组Tuple差异化 ...
- toasf的苦水
http://blog.csdn.net/qq_25867141/article/details/52807705 优化 上面的几种方式我大致也都走了一遍,其实我觉得都没啥区别,看你喜欢用哪种吧.我其 ...