前面一小节的 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 打印出来的对象竟然包含那么多东西了吧。
现代魔法 推荐于 2013-02-27 10:23