Zend_View_Abstract
Zend_View_Abstract
是个基础类,Zend_View
就是继承它的并声明 _run()
方法的具体实现 (由 render()
调用 )。
很多开发者发现他们想继承 Zend_View_Abstract
并添加自定义的函数,不可避免地碰到它的包括许多私有成员的设计问题。本文档解释其中缘由。
Zend_View
有点反模板引擎,它使用 PHP 本身作为模板,结果所有的 PHP 可用并且视图脚本继承了它所调用对象的范围 (scope)。
It is this latter point that is salient to the design decisions. 在内部,Zend_View::_run()
做:
<?php
protected function _run()
{
include func_get_arg(0);
}
?>
这样,视图脚本拥有访问当前对象 ($this
) 和任何那个对象的方法和成员 的权限,因为许多操作基于有限可见性的成员,这会引起问题:视图脚本可以直接调用方法或修改至关重要的属性。想象一下脚本意外地重写 $_path
或 $_file
-任何进一步地调用 render()
或视图助手将会中断。
幸好,PHP 5 对这个可见性声明有个方案:私有成员(private member)不能由继承该类的对象访问。所以我们就这样设计:因为 Zend_View
继承 Zend_View_Abstract
,视图脚本就这样限制到只有 Zend_View_Abstract
的 protected 或 public 成员和方法。这样有效地限制了它可以执行的动作,保证了关键的安全区域不被视图脚本修改。