3

我正在看 Yii Framework 关于博客应用程序的教程。我正在理解,但我不理解一个主要组件:这是在特定 .php视图文件的开头找到的。

<?php
$this->breadcrumbs=array(
    'Manage Posts',
);
?>

我只是想知道它$this来自哪里。据我了解,$this只有在类的范围内才能使用。但是,我看到这里没有实现任何类,所以任何人都可以告诉我 Yii 是如何为我做这件事的吗?

4

3 回答 3

3

$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

于 2012-06-28T18:29:04.707 回答
2

我很确定 Yii 会将模板编译成类,所以在运行时你确实有一个类。检查__FILE__get_class($this)了解详情。

于 2012-06-28T18:01:00.027 回答
1

如果这个模板只是require一个方法中的 d,它实际上进入了对象范围。Sothis代表一些呈现模板的 View 对象。

于 2012-06-28T18:02:51.520 回答