| 12345678910111213141516171819202122232425262728293031323334353637 |
- <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:
- -->
|