视图助手(View Helper)

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 成员和方法。这样有效地限制了它可以执行的动作,保证了关键的安全区域不被视图脚本修改。


视图助手(View Helper)