我正在看 Yii Framework 关于博客应用程序的教程。我正在理解,但我不理解一个主要组件:这是在特定 .php视图文件的开头找到的。
<?php
$this->breadcrumbs=array(
'Manage Posts',
);
?>
我只是想知道它$this
来自哪里。据我了解,$this
只有在类的范围内才能使用。但是,我看到这里没有实现任何类,所以任何人都可以告诉我 Yii 是如何为我做这件事的吗?
$this
这里指的是当前的控制器类。如果您在components/Controller.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,它实际上进入了对象范围。Sothis
代表一些呈现模板的 View 对象。