对于我和OOP所有的做法我从来没有使用$此之外的类定义的。
虽然zendframework我们在视图模板文件中使用$此,显然它不是一个类定义的范围。 我不知道它是如何被执行? 我用Google搜索了很多,但有没有运气。
我想知道zendframework如何呈现与$这一点,认为文件的机制。
对于我和OOP所有的做法我从来没有使用$此之外的类定义的。
虽然zendframework我们在视图模板文件中使用$此,显然它不是一个类定义的范围。 我不知道它是如何被执行? 我用Google搜索了很多,但有没有运气。
我想知道zendframework如何呈现与$这一点,认为文件的机制。
它实际上是一个类定义的范围。 简单的测试案例:
<?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,你会看到我的-view.php曾获得View类的私有变量。 通过使用include
,你实际上是PHP文件加载到目前的范围。
鉴于脚本文件( .phtml
的) $this
是指目前使用的实例Zend_View
类-即下令渲染这个特殊的脚本之一。 引用的文档 :
这是
[a view script]
PHP脚本像任何其他,但有一个例外:它执行的Zend_View实例的范围内,这意味着内部,要在Zend_View的实例属性和方法$这点的引用。 (由控制器分配给该实例变量是在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)
指的是完整的文件名包含脚本的(路径+名称)。