我正在看Yii Framework关于博客应用程序的教程。我正在理解的过程中,但我不明白一个主要组成部分:这是在特定.php视图文件的开头找到的。
<?php
$this->breadcrumbs=array(
'Manage Posts',
);
?>
我只想知道$this
从哪里来。据我了解,$this
只有在类范围内才能使用。但是,我在这里没有看到实现的类,所以谁能启发我 Yii 如何为我做到这一点?
这里的$this
指的是当前的控制器类。如果在组件/控制器.php中看到控制器,则还将看到$breadCrumbs=array();
。请参阅视图的权威指南:
在视图脚本中,我们可以使用 $this 访问控制器实例。因此,我们可以通过计算视图中的 $this->propertyName 来拉入控制器的任何属性。
控制器最终使用 renderInternal 呈现视图。如果你看到该函数的源代码,你会看到php的require()
:
public function renderInternal($_viewFile_,$_data_=null,$_return_=false)
{
// we use special variable names here to avoid conflict when extracting data
if(is_array($_data_))
extract($_data_,EXTR_PREFIX_SAME,'data');
else
$data=$_data_;
if($_return_)
{
ob_start();
ob_implicit_flush(false);
require($_viewFile_);
return ob_get_clean();
}
else
require($_viewFile_);
}
由于使用了 require,因此此时$this可用于包含的代码:
包含文件时,它包含的代码将继承包含所在行的变量作用域。从该点开始,调用文件中该行的任何可用变量都将在被调用文件中可用。但是,包含文件中定义的所有函数和类都具有全局范围。
因此,当我们这样做$this->render('view');
时,view
将可以访问 $ this
.
我很确定 Yii 将模板编译成类,所以在运行时你实际上有一个类。 有关详细信息,请查看__FILE__
和get_class($this)
。
如果这个模板只是在方法中require
d,它实际上进入了对象范围。所以this
代表一些呈现 temlate 的视图对象。