为什么在视图中没有$ this的情况下可以访问变量?

时间:2013-08-13 10:00:57

标签: php templates zend-framework2 scope

我不久前开始使用Zend Framework 2.

在控制器中,我使用

发送变量进行查看
    return $viewmodel->setVariables(array(
                'exampleVariable' => 'exampleValue', 
                'exampleVariable2' => array(
                    'variableInArray' => $this->getMacAddress(),
                ),
    ));

在我正在做的观点中:

$exampleVariable = $this->exampleVariable
// and 
$exampleVariable2 = $this->exampleVariable2

然后直接使用这些变量,所以每次使用它时都不需要经过$this

我正在研究它,并修改了一些东西,虽然我想调试,但我删除了前两行希望它会破坏。

令我惊讶的是,$exampleVariable$exampleVariable2仍然可用。起初,我认为这是一个缓存问题,但事实证明,使用SetVariables()发送到视图的所有数组键都可以作为变量进行访问。

我的问题是,如何在没有$this的情况下访问它们?

我可能会被警告这个,但这个问题只是为了好奇。我不会直接使用变量,因为我更喜欢在视图中创建它们,所以我可以对它们进行注释并添加它们各自的变量类型和内容。

2 个答案:

答案 0 :(得分:1)

如果你看一下PHPRenderer类,特别是PHPRendered :: render()

Zend\View\Renderer\PHPRenderer 

您将使用extract(http://php.net/extract

查看视图的生成方式

这允许在视图/模板内本地访问任何视图变量。

答案 1 :(得分:1)

看看here

  

分配给视图的变量 - 通过视图模型,变量容器,或者只是通过将变量数组传递给render() - 可以通过三种方式检索:

  • 明确地,通过从PhpRenderer中组成的Variables容器中检索它们:$ this-> vars() - > varname。
  • 作为PhpRenderer实例的实例属性:$ this-> varname。 (在这种情况下,实例属性访问只是代理组合的Variables实例。)
  • 作为本地PHP变量:$ varname。 PhpRenderer在本地提取Variables容器的成员。

解释:

PhpRenderer使用extract函数将变量提取到函数(render)范围中。这允许在模板中使用$exampleVariable。此外,PhpRenderer使用魔术__get功能。因此,如果您致电$this->exampleVariable,它会直接查看数据数组。