• CodeIgniter index.php原本框架执行顺序

    流程大致一样
    服务器君一共花费 364.814 ms 进行了 4 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

    与 CodeIgniter 的 index.php 的差异

    前面一小节的 index.php 是我自己按着 CodeIgniter 的框架思路写的,与 CodeIgniter 自己的 index.php 有差异。

    CodeIgniter index.php 在末尾加了一句:

    require_once BASEPATH.'core/CodeIgniter.php';
    

    CodeIgniter.php 加载需要的类库,CI框架所有操作都在这里执行。

    再来 CodeIgniter.php:

    require(BASEPATH.'core/Common.php');
    
    // Common.php主要是load_class()加载各种所需的类库
    // 比如加载配置文件类什么的 
    $CFG =& load_class('Config', 'core');
    $URI =& load_class('URI', 'core');
    $RTR =& load_class('Router', 'core');
    $RTR->_set_routing();
    $SEC =& load_class('Security', 'core');
    $IN	=& load_class('Input', 'core');
    
    require BASEPATH.'core/Controller.php';
    function &get_instance()
    {
    	return CI_Controller::get_instance();
    }
    
    // 从$RTR类解析出URL的 class 名与 method 名
    $class  = $RTR->fetch_class();
    $method = $RTR->fetch_method();
    
    call_user_func_array(array(&$CI, $method), array_slice($URI->rsegments, 2));
    

    在上面的 CodeIgniter.php 里面加载了 Controller.php 这个控制器超级类:

    class CI_Controller {
    
    	private static $instance;
    
    	/**
    	 * Constructor
    	 */
    	public function __construct()
    	{
    		self::$instance =& $this;
    		
    		// 分配引导文件中所有被实例化的类对象到当前对象属性中
    		// 因此,CI程序能把这些属性当成超级对象来使用
    		// 意味着我们所写的控制器只要继承CI_Controller,就可以使用所有加载的类(方法、属性)。
    		foreach (is_loaded() as $var => $class)
    		{
    			$this->$var =& load_class($class);
    		}
    
    		$this->load =& load_class('Loader', 'core');
    
    		$this->load->initialize();
    		
    		log_message('debug', "Controller Class Initialized");
    	}
    
    	public static function &get_instance()
    	{
    		return self::$instance;
    	}
    }
    

    也就是说,通过 $CI = new $class(); (即 CI_Controller::get_instance();) 产生的对象,都是超级对象,只要加载了的类,在这个对象中都能使用它们的方法。现在你知道,为啥在 从index.php开始看CodeIgniter的URL映射 这篇文章末尾,将 $CI 打印出来的对象竟然包含那么多东西了吧。

更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [移动开发] Android与SQLite数据库 7 个条目
  2. [移动开发] 从代码角度去认识 Thread 9 个条目
  3. [移动开发] Android 开发调试工具 ADB 3 个条目
  4. [Python程序设计] 标准库:urllib/urllib2 14 个条目
  5. [移动开发] 从代码角度去认识HttpClient 2 个条目
  6. [软件工程与项目管理] 浏览器初步介绍 8 个条目
  7. [Python程序设计] urls.py设置技巧 8 个条目
  8. [PHP程序设计] PHP里的引用 5 个条目
  9. [PHP程序设计] PHP与Stream流 5 个条目
  10. [数据库技术] MySQL常用自带函数 3 个条目
  11. [Python程序设计] Python数据类型 11 个条目
  12. [Python程序设计] Tornado源码解析 23 个条目
窗口 -- [协会]