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

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

index.php

  • 设置项目运行环境;

  • 设置系统目录;

  • define一些常量;

    1. BASEPATH -> /systerm/
    2. APPPATH -> /application/
    3. 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_classis_loadget_configconfig_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,菜鸟,阅读)