<sect1 id="zend.view.abstract">
    <title>Zend_View_Abstract</title>

    <para>
        <code>Zend_View_Abstract</code> 是个基础类，<code>Zend_View</code> 就是继承它的并声明 <code>_run()</code> 方法的具体实现 （由 <code>render()</code> 调用 ）。
    </para>

    <para>
        很多开发者发现他们想继承 <code>Zend_View_Abstract</code> 并添加自定义的函数，不可避免地碰到它的包括许多私有成员的设计问题。本文档解释其中缘由。
    </para>

    <para>
        <code>Zend_View</code> 有点反模板引擎，它使用 PHP 本身作为模板，结果所有的 PHP 可用并且视图脚本继承了它所调用对象的范围 （scope）。
    </para>

    <para>
        It is this latter point that is salient to the design decisions. 在内部，<code>Zend_View::_run()</code> 做：
    </para>

    <programlisting role="php"><![CDATA[<?php
protected function _run()
{
    include func_get_arg(0);
}
?>]]></programlisting>

    <para>
        这样，视图脚本拥有访问当前对象 (<code>$this</code>) <emphasis>和任何那个对象的方法和成员</emphasis> 的权限，因为许多操作基于有限可见性的成员，这会引起问题：视图脚本可以直接调用方法或修改至关重要的属性。想象一下脚本意外地重写 <code>$_path</code> 或 <code>$_file</code> －任何进一步地调用 <code>render()</code> 或视图助手将会中断。
    </para>

    <para>
        幸好，PHP 5 对这个可见性声明有个方案：私有成员（private member）不能由继承该类的对象访问。所以我们就这样设计：因为 <code>Zend_View</code> <emphasis> 继承 </emphasis> <code>Zend_View_Abstract</code>，视图脚本就这样限制到只有 <code>Zend_View_Abstract</code> 的 protected 或 public 成员和方法。这样有效地限制了它可以执行的动作，保证了关键的安全区域不被视图脚本修改。
    </para>
</sect1>
<!--
vim:se ts=4 sw=4 et:
-->
