CodeIgniter源码阅读(一)(index.php && CodeIgniter.php)
2012-12-07 16:18
288 查看
菜鸟看框架,一些不懂的地方是网上查的或者看别人写的源码阅读里的分析~如有雷同还望海涵:)。所有写下来的文字都是自己看懂和理解了之后的~如有错误还望指出,我是个新人~~~
设置系统目录;
define一些常量;
BASEPATH -> /systerm/
APPPATH -> /application/
EXT、SELF等等
根据系统的不同(win,linux)对路径做出一些修剪处理。
加载完成以上配置
index.php是CodeIgniter的入口文件,换句话说,用CI搭建的框架,我们发送的请求都是请求的这个文件,后面跟的controller和method都是跟在URL后面的参数。比如
这个文件里包含一些基本函数,如
值得注意的是,common文件里的load_class函数,最后返回的是被实例化之后的对象,也就说说实际上通过这个函数加载的类都是被require了文件,也实例化了文件里包含的对象。(所以$this才能用嘛~~)。
加载APPPATH里 config/constants.php
这里面放的是一些define的常量,主要是一些文件读写操作的权限;如755,r+b等。
获取扩展配置
设定一些PHP参数
加载基准测试类Benchmark
对程序运行状态做出一些标记。
加载core里的Hook类,Config类,Utf8类,URI类,Router类,Output类,Security类,Input类,Lang类;
加载核心类库,Config,Router,Output,根据当前配置、状态等做出一些处理。
请求core里的Controller.php文件
这里为什么是
如果有扩展Controller,就加载
通过Router加载Controller
调用Router里
方法验证
看看下面这段代码:
重点是
这是一个值得注意的地方,默认以下划线开头的方法都是非公开的方法。
如果没有找到页面,返回404
实例化请求的Controller,做出处理
值得注意的是有个
然后就是验证method是否存在,不存在就返回404等等。
调用请求的控制器方法
标记状态,加载hook,调用Output里的
hook这个东西,我还不是很理解,后面仔细看的时候再说。
至于既然controller里有
如果当前有数据库连接,就关闭
到现在就完成了整个从请求到输出的一个完整的过程。所以CodeIgniter里这个文件是核心文件。这个文件里的代码运行一次整个CI应用都完成了一次完整的运作。
index.php
设置项目运行环境;设置系统目录;
define一些常量;
BASEPATH -> /systerm/
APPPATH -> /application/
EXT、SELF等等
根据系统的不同(win,linux)对路径做出一些修剪处理。
加载完成以上配置
require_once BASEPATH.'coreCodeIgniter.php';
index.php是CodeIgniter的入口文件,换句话说,用CI搭建的框架,我们发送的请求都是请求的这个文件,后面跟的controller和method都是跟在URL后面的参数。比如
http://localhost/index.php?/admin/main,问号以后实际上都是参数了,为了方便用户浏览,我们在.htaccess和http.conf里开启了隐藏
/index.php?,把URL写成
http://localhost/admin/main,但是不能被这个所迷惑,以为是直接访问的
admin/main。
CodeIgniter.php
先请求Common.php这个文件里包含一些基本函数,如
load_class,
is_load,
get_config,
config_item,以及错误处理(
show_404),状态处理(
set_status_header),异常处理(
_exception_handler)的函数,通过
$_error =& load_class('Exceptions', 'core');加载真正起到错误处理的是Exception组件。
值得注意的是,common文件里的load_class函数,最后返回的是被实例化之后的对象,也就说说实际上通过这个函数加载的类都是被require了文件,也实例化了文件里包含的对象。(所以$this才能用嘛~~)。
加载APPPATH里 config/constants.php
这里面放的是一些define的常量,主要是一些文件读写操作的权限;如755,r+b等。
获取扩展配置
get_config(array('subclass_prefix' => $assign_to_config['subclass_prefix']));
设定一些PHP参数
@set_time_limit(300);等。
加载基准测试类Benchmark
对程序运行状态做出一些标记。
加载core里的Hook类,Config类,Utf8类,URI类,Router类,Output类,Security类,Input类,Lang类;
加载核心类库,Config,Router,Output,根据当前配置、状态等做出一些处理。
请求core里的Controller.php文件
require BASEPATH.'core/Controller.php';
这里为什么是
require而不是
load_class呢?看来这个问题只有到了
CI_Controller里才能知道咯。
如果有扩展Controller,就加载
require APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php';
通过Router加载Controller
调用Router里
fetch_directory方法获取路径,
fetch_class获取类。
方法验证
看看下面这段代码:
`if ( ! class_exists($class) OR strncmp($method, '_', 1) == 0 OR in_array(strtolower($method), array_map('strtolower', get_class_methods('CI_Controller'))) )`
重点是
strncmp($method, '_', 1) == 0,就是说如果我的方法名字的第一个字符是下划线,就不能通过验证。换句话说,即使我这是一个public的方法,在浏览器里发出请求也是不能获取到数据的 T_T.
这是一个值得注意的地方,默认以下划线开头的方法都是非公开的方法。
如果没有找到页面,返回404
实例化请求的Controller,做出处理
值得注意的是有个
_remap方法可以很方便的改变URL,隐藏方法或者借这个函数做简单的函数方法控制(比如验证用户是否有访问方法的权限)。
然后就是验证method是否存在,不存在就返回404等等。
调用请求的控制器方法
call_user_func_array(array(&$CI, $method), array_slice($URI->rsegments, 2));
标记状态,加载hook,调用Output里的
_display()方法输出视图
hook这个东西,我还不是很理解,后面仔细看的时候再说。
至于既然controller里有
$this->load->view()的方法,这里还要调用Oupput呢,因为
$this->load->view()并不是马上输出结果,而是把结果放到缓冲区,然后最后Output类把它冲出来。
如果当前有数据库连接,就关闭
到现在就完成了整个从请求到输出的一个完整的过程。所以CodeIgniter里这个文件是核心文件。这个文件里的代码运行一次整个CI应用都完成了一次完整的运作。
相关文章推荐
- CodeIgniter源码阅读笔记(6)——地址解析类URI.php
- CodeIgniter源码分析之index.php
- CodeIgniter源码阅读笔记(3)——公共函数Common.php
- CodeIgniter源码阅读(三)(URI.php)
- CodeIgniter源码阅读笔记(5)——钩子Hooks.php
- CodeIgniter 核心代码阅读-入口文件index.php
- CodeIgniter源码阅读(四)(Loader.php)
- CI框架源码阅读笔记2 一切的入口 index.php
- CodeIgniter源码分析之index.php
- CodeIgniter框架源码笔记(2)——请求的接收者:框架入口index.php
- CI框架源码阅读笔记4 引导文件CodeIgniter.php
- CodeIgniter源码分析(二) 入口文件index.php
- CodeIgniter源码阅读(6)Hook.php 扩展框架的实现原理
- CI框架源码阅读笔记4 引导文件CodeIgniter.php
- CodeIgniter源码阅读笔记(4)——性能测试Benchmark.php
- CodeIgniter源码阅读URI.php中_fetch_uri_string()函数的解析
- Yii2框架源码追踪阅读(一)--从入口脚本index.php到类加载器的初始化
- CodeIgniter源码阅读笔记(7)——路由类Router.php
- CodeIgniter框架——源码分析之入口文件index.php
- CodeIgniter源码阅读(二)(Router.php)