CodeIgniter中的$ this关键字

时间:2011-09-02 12:24:59

标签: php codeigniter

我正在尝试了解CodeIgniter中视图文件的$this->load->view()如何在中工作。

core / Controller.php调用core / Loader.php然后调用_ci_load(),然后调用include('/path/to/view');

那时$this不应该引用Loader类吗? $this如何引用控制器?

根据我的理解,你应该在视图文件中调用$ this-> view()。不是$ this-> load-> view()因为在Loader中无法访问load()函数。它是Controller基类的类变量。即,$this->load =& load_class('Loader');

请注意:我正在尝试了解CodeIgniter内部。我非常清楚如何将视图文件作为CodeIgniter 用户嵌入到其他视图文件中。请不要留下解释如何使用 $ this-> load()的答案。

2 个答案:

答案 0 :(得分:4)

为了简化对$this在视图中引用的内容的理解,由于视图是由控制器方法“加载”的,因此视图仍然在与该方法相同的范围内运行,这意味着{{1}根据加载它的类,可以有不同的上下文。

例如:

$this

在此示例控制器中加载的任何视图文件中,class Controller1 extends CI_Controller {} 专门指$this类,它也可以访问Controller1公共和受保护的属性/方法(如Loader或输入类,分配给CI_Controller的CI_Controllerload属性,因为它扩展该类。

控制器仍然只是普通的旧PHP类。如果我这样做:

input

...如果我们在其中任何一个控制器的任何方法中加载相同的视图文件,则在该视图文件中使用class Controller1 extends CI_Controller { $this->foobar = 'Hello'; } class Controller2 extends CI_Controller { $this->foobar = 'World'; } 将返回不同的值。

答案 1 :(得分:3)

我上次检查时,$this属于CI_Loader课程,请在视图中尝试var_dump($this);


退房:

https://github.com/EllisLab/CodeIgniter/blob/develop/system/core/Controller.php

is_loaded();返回一个数组,其中包含已加载的类名及其主容器中的别名。

$this->load是控制器内CI_Loader的实例。


检查:

https://github.com/EllisLab/CodeIgniter/blob/develop/system/core/Loader.php

第778行