新手求解源码问题,如鲠在喉, model中的$this->load实例化问题
刚开始学习CI源码,看到一个创建的model源码这样写的:class News_model extends CI_Model {
public function __construct()
{
$this->load->database();
}}这里的$this->load 对象是 CI_Loader的类型。我知道在CI_Controller的构造函数中实例化了一个load对象,有这句代码:$this->load =& load_class('Loader', 'core');因为我通过var_dump 这两处对象确实是同一个,但是通过log_message 看到load的构造函数确实只调用了一次,我的疑问是在类News_model 中,$this->load 是如何关联上上面那个load呢?
各路神仙帮我分析下吧,我之前一直做C、C++的开发,php是新学的 通过一个单例,所有地方使用的 Loader 对象其实是同一个 jerrybendy 发表于 2016-5-3 19:46
通过一个单例,所有地方使用的 Loader 对象其实是同一个
那能否请教一下,在类News_model中,它是如何也获取的load变量,没有地方申明这个类也有一个loader类型的成员变量,$this指的是News_model的对象,为什么$this->load没有报错 本帖最后由 一叶扁舟 于 2016-5-4 09:03 编辑
load_class()是用来加载类的获得某个类的一个单一实例,也就请求的类不存在就实例化一个静态类并返回,存在则直接返回请求的类。可以看看load_class的源代码system/core/commen里。
$this->load可以直接调用是因为$this已经获取了CodeIgniter 的全局资源对象,和我们自己写类的时候先用get_instance()获取全局资源对象一样 一叶扁舟 发表于 2016-5-4 08:58
load_class()是用来加载类的获得某个类的一个单一实例,也就请求的类不存在就实例化一个静态类并返回,存在 ...
感谢回复。
但是这句代码 $this->load是在我自己写的model类中调用,所以$this 指的是news_model对象,它并非是CodeIgniter 的全局资源对象,能否在解释一步? hustzju 发表于 2016-5-4 09:24
感谢回复。
但是这句代码 $this->load是在我自己写的model类中调用,所以$this 指的是news_model对象, ...
PHP 是动态语言,类成员是可以在运行时直接定义的,这些和 C 等静态语言是完全不同的。 我找到答案了,在model的父类CI_model中有这么一个函数:
public function __get($key)
{
// Debugging note:
// If you're here because you're getting an error message
// saying 'Undefined Property: system/core/Model.php', it's
// most likely a typo in your model code.
return get_instance()->$key;
}这个函数上面有一段注释:* __get magic
*
* Allows models to access CI's loaded classes using the same
* syntax as controllers.是说允许models的对象使用CI的已经加载的类,$this->load 实际上调用的是get_instance()->load,即获取的是CI->load
Hex 发表于 2016-5-4 10:46
PHP 是动态语言,类成员是可以在运行时直接定义的,这些和 C 等静态语言是完全不同的。 ...
谢谢大神回复,确实用久了C++,刚转过来看php有点不习惯,多向大家学习,我这个疑问得到答案了,请看我8楼的解释,不知道是否正确。 hustzju 发表于 2016-5-4 10:52
谢谢大神回复,确实用久了C++,刚转过来看php有点不习惯,多向大家学习,我这个疑问得到答案了,请看我8 ...
是的,就是这个魔术方法,哈哈。
我以前也写C++,不过后来动态语言用习惯以后,再让我写 C++ 就感觉写起来很繁琐了。。。
页:
[1]
2