Zend_View-Abstract.xml 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. <sect1 id="zend.view.abstract">
  2. <title>Zend_View_Abstract</title>
  3. <para>
  4. <code>Zend_View_Abstract</code> 是个基础类,<code>Zend_View</code> 就是继承它的并声明 <code>_run()</code> 方法的具体实现 (由 <code>render()</code> 调用 )。
  5. </para>
  6. <para>
  7. 很多开发者发现他们想继承 <code>Zend_View_Abstract</code> 并添加自定义的函数,不可避免地碰到它的包括许多私有成员的设计问题。本文档解释其中缘由。
  8. </para>
  9. <para>
  10. <code>Zend_View</code> 有点反模板引擎,它使用 PHP 本身作为模板,结果所有的 PHP 可用并且视图脚本继承了它所调用对象的范围 (scope)。
  11. </para>
  12. <para>
  13. It is this latter point that is salient to the design decisions. 在内部,<code>Zend_View::_run()</code> 做:
  14. </para>
  15. <programlisting role="php"><![CDATA[<?php
  16. protected function _run()
  17. {
  18. include func_get_arg(0);
  19. }
  20. ?>]]></programlisting>
  21. <para>
  22. 这样,视图脚本拥有访问当前对象 (<code>$this</code>) <emphasis>和任何那个对象的方法和成员</emphasis> 的权限,因为许多操作基于有限可见性的成员,这会引起问题:视图脚本可以直接调用方法或修改至关重要的属性。想象一下脚本意外地重写 <code>$_path</code> 或 <code>$_file</code> -任何进一步地调用 <code>render()</code> 或视图助手将会中断。
  23. </para>
  24. <para>
  25. 幸好,PHP 5 对这个可见性声明有个方案:私有成员(private member)不能由继承该类的对象访问。所以我们就这样设计:因为 <code>Zend_View</code> <emphasis> 继承 </emphasis> <code>Zend_View_Abstract</code>,视图脚本就这样限制到只有 <code>Zend_View_Abstract</code> 的 protected 或 public 成员和方法。这样有效地限制了它可以执行的动作,保证了关键的安全区域不被视图脚本修改。
  26. </para>
  27. </sect1>
  28. <!--
  29. vim:se ts=4 sw=4 et:
  30. -->