我正在查看Yii Framework关于博客应用程序的教程。我正在理解,但我不理解一个主要组件:这是在特定的.php 视图文件的开头找到的。
<?php
$this->breadcrumbs=array(
'Manage Posts',
);
?>
我想知道$this
来自哪里。据我所知,$this
只能在类的范围内使用。但是,我看到这里没有实现课程,所以任何人都可以告诉我Yii如何为我做这个吗?
答案 0 :(得分:3)
$this
这里指的是当前的控制器类。如果您在 components / Controller.php 中看到控制器,您还会看到$breadCrumbs=array();
。见definitive guide to views:
在视图脚本中,我们可以使用 $ this 访问控制器实例。因此,我们可以通过在视图中评估 $ this-&gt; propertyName 来获取控制器的任何属性。
控制器最终使用renderInternal呈现视图。如果你看到该功能的来源,你会看到php's 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
。
答案 1 :(得分:2)
我很确定Yii会将模板编译成类,所以在运行时你确实有一个类。查看__FILE__
和get_class($this)
了解详情。
答案 2 :(得分:1)
如果此模板只是方法内的require
d,它实际上会进入对象范围。所以this
代表一些渲染temlate的View对象。