对于我使用OOP的所有练习,我从未在类定义之外使用$ this。
在zendframework中我们在视图模板文件中使用$ this,显然它不是类定义的范围。我想知道它是如何实现的? 我google了很多但没有运气。
我想知道zendframework如何使用$ this呈现它的视图文件的机制。
答案 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文件加载到当前范围。