与 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 打印出来的对象竟然包含那么多东西了吧。