CodeIgniters动态加载类如何工作?

时间:2012-02-17 10:46:30

标签: php codeigniter

我正在尝试构建我自己的简单MVC框架,主要用于教育目的而不是其他任何东西,我过去使用过CodeIgniter,它为我希望融入我的框架的功能提供了大部分灵感。

我想构建一个像CodeIgniters这样的加载器类,但我无法理解CI如何加载类,就好像它们是调用类的属性,即

class Random_Controller{

    function __construct(){
    $this->load->helper('some_class');
    $this->some_class->do_something();
    /*
    How does CI load some_class as if it were a property of Random_Controller?
    I can understand using something like $$class_name = new $class_name();
    Or $$this->class_name = new $class_name();
    But how can the dynamically named object be used with $this->?
    */
    }
}

希望这有意义......

我总是惊讶于正确解释时出现的简单事物。还有一个问题。

如果$ load是对load类实例的引用,并且所有已加载类的记录都保存在数组中,那么我们基本上是这样做的:     $这 - > loaded_classes [$键] - GT; do_something()?

那么CI如何将数组解析为变量名?我已经看到一些PHP魔术方法在变量不存在或方法不存在时被调用,这是否可以与这些魔术方法结合使用?换句话说,如果$ this-> some_class属性不存在,我们用该键搜索数组中的元素?

如果这是有道理的..

1 个答案:

答案 0 :(得分:1)

嗯,好吧,让我们从这开始:CI_Controller超类;它是所有控制器扩展的一个,并充当CI超级项目所有$ this引用。

CI_Controller充当单例,并在初始化期间调用一个函数load_class()(你可以在core / common.php中找到)作为自动加载器:在静态数组中($ _classes)它指定类名作为索引,并作为类实例的值:

$_classes[$class] = new $name();

然后,伴侣is_loaded()函数(在同一个文件中)在数组中注册所有加载的函数,并用于稍后检查该类是否已经实例化。

Ci_Controller然后为其$ load属性分配一个Loader类的实例(core / loader.php,使用上述机制)

$this->load =& load_class('Loader', 'core');

反过来,它负责使用自己的方法加载所有其他资源:helper(),library(),model()等。看看所有细节的来源,希望你能得到图片

根据您的评论澄清:

$load = new Loader();
$load->helper('helper');

与:

相同

$this->load->helper('helper')

因为$this->load包含Loader类的实例(通过引用)。 那么Loader类的helper(),library()等方法如何工作在这里写得太多了,除此之外你可以打开Loader.php文件并自己看看。