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


How come it is possible to access variables without $this in the view?

我不久前开始使用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的情况下访问它们?

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

看看这里

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

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

解释:

PhpRenderer 使用extract函数将变量提取到函数(渲染(作用域中。这允许在模板中使用$exampleVariable。此外,PhpRenderer使用魔术__get函数。因此,如果您调用$this->exampleVariable它会直接在数据数组中查找。

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

Zend'View'Renderer'PHPRenderer 

您将看到如何使用提取 (http://php.net/extract( 生成视图

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