$这是如何在zend框架中的.phtml文件中工作的?

时间:2012-12-12 12:56:04

标签: php zend-framework this

对于我使用OOP的所有练习,我从未在类定义之外使用$ this。

在zendframework中我们在视图模板文件中使用$ this,显然它不是类定义的范围。我想知道它是如何实现的? 我google了很多但没有运气。

我想知道zendframework如何使用$ this呈现它的视图文件的机制。

2 个答案:

答案 0 :(得分:10)

在视图脚本文件中(.phtml个)$this指的是当前使用的Zend_View类实例 - 被命令呈现此特定脚本的实例。引用the doc

  

这是[a view script] PHP脚本和其他任何一个脚本一样   异常:它在Zend_View实例的范围内执行,   这意味着对$ this的引用指向Zend_View实例   属性和方法。 (由实例分配给实例的变量   controller是Zend_View实例的公共属性。

这就是它的完成方式:当你的控制器调用(显式或隐式)render方法(在Zend_View_Abstract类中定义)时,以下方法(在Zend_View类中定义)是最后执行:

/**
 * Includes the view script in a scope with only public $this variables.
 *
 * @param string The view script to execute.
 */
protected function _run()
{
   if ($this->_useViewStream && $this->useStreamWrapper()) {
      include 'zend.view://' . func_get_arg(0);
   } else {
      include func_get_arg(0);
   }
}

...其中func_get_arg(0)指的是包含脚本的完整文件名(路径+名称)。

答案 1 :(得分:3)

实际上在类定义的范围内。简单的测试用例:

<?php
// let's call this view.php
class View {
   private $variable = 'value';
   public function render( ) {
       ob_start( );
       include 'my-view.php';
       $content = ob_get_clean( );
       return $content;
   }
}
$view = new View;
echo $view->render( );

现在,创建另一个文件:

<?php
// let's call this my-view.php.
<h1>Private variable: <?php echo $this->variable; ?></h1>

现在去访问view.php,你会看到my-view.php可以访问View类的私有变量。通过使用include,您实际上将PHP文件加载到当前范围。