基本的Yii概念:$这个定义在哪里?

时间:2012-06-28 17:58:58

标签: php yii

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

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

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

3 个答案:

答案 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对象。