用户
 找回密码
 入住 CI 中国社区
搜索
查看: 2088|回复: 10
收起左侧

[HELP] 新手求解源码问题,如鲠在喉, model中的$this->load实例化问题

[复制链接]
发表于 2016-5-3 17:58:27 | 显示全部楼层 |阅读模式
刚开始学习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呢?
 楼主| 发表于 2016-5-3 17:59:20 | 显示全部楼层
各路神仙帮我分析下吧,我之前一直做C、C++的开发,php是新学的
发表于 2016-5-3 19:46:30 | 显示全部楼层
通过一个单例,所有地方使用的 Loader 对象其实是同一个
 楼主| 发表于 2016-5-3 22:41:31 | 显示全部楼层
jerrybendy 发表于 2016-5-3 19:46
通过一个单例,所有地方使用的 Loader 对象其实是同一个

那能否请教一下,在类News_model中,它是如何也获取的load变量,没有地方申明这个类也有一个loader类型的成员变量,$this指的是News_model的对象,为什么$this->load没有报错
发表于 2016-5-4 08:58:39 | 显示全部楼层
本帖最后由 一叶扁舟 于 2016-5-4 09:03 编辑

load_class()是用来加载类的获得某个类的一个单一实例,也就请求的类不存在就实例化一个静态类并返回,存在则直接返回请求的类。可以看看load_class的源代码system/core/commen里。
$this->load可以直接调用是因为$this已经获取了CodeIgniter 的全局资源对象,和我们自己写类的时候先用get_instance()获取全局资源对象一样
 楼主| 发表于 2016-5-4 09:24:30 | 显示全部楼层
一叶扁舟 发表于 2016-5-4 08:58
load_class()是用来加载类的获得某个类的一个单一实例,也就请求的类不存在就实例化一个静态类并返回,存在 ...

感谢回复。
但是这句代码 $this->load  是在我自己写的model类中调用,所以$this 指的是news_model对象,它并非是CodeIgniter 的全局资源对象,能否在解释一步?
发表于 2016-5-4 10:46:37 | 显示全部楼层
hustzju 发表于 2016-5-4 09:24
感谢回复。
但是这句代码 $this->load  是在我自己写的model类中调用,所以$this 指的是news_model对象, ...

PHP 是动态语言,类成员是可以在运行时直接定义的,这些和 C 等静态语言是完全不同的。
 楼主| 发表于 2016-5-4 10:50:35 | 显示全部楼层
我找到答案了,在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

 楼主| 发表于 2016-5-4 10:52:39 | 显示全部楼层
Hex 发表于 2016-5-4 10:46
PHP 是动态语言,类成员是可以在运行时直接定义的,这些和 C 等静态语言是完全不同的。 ...

谢谢大神回复,确实用久了C++,刚转过来看php有点不习惯,多向大家学习,我这个疑问得到答案了,请看我8楼的解释,不知道是否正确。
发表于 2016-5-4 10:57:36 | 显示全部楼层
hustzju 发表于 2016-5-4 10:52
谢谢大神回复,确实用久了C++,刚转过来看php有点不习惯,多向大家学习,我这个疑问得到答案了,请看我8 ...

是的,就是这个魔术方法,哈哈。

我以前也写C++,不过后来动态语言用习惯以后,再让我写 C++ 就感觉写起来很繁琐了。。。

本版积分规则