Zend Layout中的$this变量

3

我正在学习Zend框架的教程和文档,大部分内容都很容易理解,直到我遇到了/application/layout/scripts/layout.phtml中的$this变量。文档提到$this是在引导过程中创建的视图对象的一个实例。

据我所知,在类上下文中,$this是PHP中用于引用同一对象的保留关键字,因此不能将其用作变量名。任何尝试将其用作变量的行为都会导致以下错误信息:Fatal error: Cannot re-assign $this。根据作者的说法:有一个名为$this的变量可用,它是视图对象的一个实例,我无法理解这背后的理论。为什么可以在类上下文之外使用$this


你的答案在Zend论坛上。同样的问题已经在这里被问过并得到了回答http://forums.zend.com/viewtopic.php?f=69&t=16873 - shail
2个回答

6

实际上,它是在对象的上下文中使用的。您应该自己查看代码,但render()背后的基本思想(这是toString方法的代理):

public function render()
{
    //Start output buffering
    ob_start();
    include $this->viewScript;
    //Get the content from the include
    $content = ob_get_flush();
    return $content;
}

Zend Framework采用了更加复杂的方式,使其比这更加灵活,但基本思想相同。

然后,在viewScript内部,它在技术上被视为在render()方法中,就像代码实际上位于“include...”处一样。(过于简化,但整体思路保持不变。)


很棒的答案。从来没有想过 PHP 可以做到这一点 :)。 - Ibrahim Azhar Armar
谢谢rjz。你的答案基本上是一样的,只是与Zend的做法略有不同 :)。是的,Ibrahim,include可以做一些相当奇怪的事情。它几乎完全像C/C++中的#include,因为它基本上将文件的内容放在了include的位置。一个相当有趣的用法是function blah() { include 'somefile.php'; },其中somefile.php包含类似*return array(...);*的内容。然后它是一个返回在文件中定义的数组的函数。(虽然这是一个糟糕的例子,但在一些情况下可以用来有用。) - Corbin

3

可能是在类上下文中使用。想象一下按照以下方式创建视图:

class View {

  public function render($viewfile = 'views/myviewfile.phtml') {
    ob_start();
      include($viewfile);
      $view_data = ob_get_contents();
    ob_end_clean();

    echo $view_data;
  }
}

视图展示过程可能比简单捕获包含的视图文件更复杂,但您可以看到当调用View::render()时,视图中将可用$this


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接