我正在尝试构建我自己的简单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属性不存在,我们用该键搜索数组中的元素?
如果这是有道理的..
答案 0 :(得分:1)
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文件并自己看看。