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 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
随机推荐
- document文档流详解
html页面下载完默认会打开一个文档流document对象(调用document.open,此时浏览器标题左边会显示加载中图标),开始从上往下渲染内容,渲染完成调用document.close关闭渲染 ...
- Java API 之 Annotation功能
JDK1.5开始增加了Annotation功能,该功能可用于: 1.类: 2.构造方法: 3.成员变量: 4.方法 5.参数 等的声明: 该功能并不影响程序的运行,但是会对编译器警告等辅助工具产生影响 ...
- spring_boot启动报错
配置好pom文件后,在controller加注解,如下: 运行后报错!!! 发现配置加的是多此一举,修改为下边的,运行OK
- javaweb之jsp标签
1.JSP标签简介 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. 2.JSP常用标签 ...
- Nginx 502错误总结
http请求流程:一般情况下,提交动态请求的时候,nginx会直接把 请求转交给php-fpm,而php-fpm再分配php-cgi进程来处理相关的请求,之后再依次返回,最后由nginx把结果反馈给客 ...
- SZU4
#include <iostream> #include <string> #include <cstring> #include <cstdlib> ...
- Synchronized的原理及自旋锁,偏向锁,轻量级锁,重量级锁的区别(摘抄和理解)
1. 自旋锁的优缺点: 自旋锁 自旋锁原理非常简单,如果持有锁的线程能在很短时间内释放锁资源,那么那些等待竞争锁的线程就不需要做内核态和用户态之间的切换进入阻塞挂起状态,它们只需要等一等(自旋),等持 ...
- thinkphp下通过页面链接传递的参数获取一次后失效
在thinkphp下通过页面链接传递的参数获取一次后失效,ajax内部无法再次使用.想要使用必须再次用js获取其值,通过ajax传递给后台使用. 1.通过页面链接传递参数给下一页 2.可以再下一页后台 ...
- javascript判断一个元素是另外一个元素的子元素
javascript判断一个元素是另外一个元素的子元素用途有很多,最常用的就是当点击页面的空白处去执行某些操作,比如弹出层等. function isParent (obj,parentObj){ w ...
- Linux基础之命令练习Day7-nginx,nfs
一. Nginx Nginx("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由Igor Sysoev为俄罗 ...