您的位置:首页 > 编程语言 > PHP开发

CodeIgniter源码阅读(一)(index.php && CodeIgniter.php)

2012-12-07 16:18 288 查看
菜鸟看框架,一些不懂的地方是网上查的或者看别人写的源码阅读里的分析~如有雷同还望海涵:)。所有写下来的文字都是自己看懂和理解了之后的~如有错误还望指出,我是个新人~~~

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应用都完成了一次完整的运作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: