1 <?xml version="1.0" encoding="UTF-8"?>
3 <!-- EN-Revision: 18822 -->
4 <sect1 id="zend.view.abstract">
5 <title>Zend_View_Abstract</title>
8 <classname>Zend_View_Abstract</classname> は
9 <classname>Zend_View</classname> の基底クラスです。<classname>Zend_View</classname>
10 は、単にこれを継承したうえで <methodname>_run()</methodname>
12 (このメソッドは <methodname>render()</methodname> から実行されます)。
16 <classname>Zend_View_Abstract</classname> を継承したクラスを作成して
17 独自の機能を追加したいと思われる方も多いことでしょう。
18 このクラスにはさまざまなプライベートメンバーが存在するので、
20 このドキュメントでは、このクラスの設計方針とそこにいたる考え方を説明します。
24 <classname>Zend_View</classname> は、言わば「アンチテンプレートエンジン」
25 といったものであり、<acronym>PHP</acronym> のネイティブ機能を用いて描画を行います。
26 <acronym>PHP</acronym> のすべての機能がそのまま利用でき、
27 ビュースクリプトのスコープは呼び出し元オブジェクトを継承します。
31 特に後者は、この設計の重要なポイントとなります。
32 内部的には、<methodname>Zend_View::_run()</methodname> がやっているのは次のような処理です。
35 <programlisting language="php"><![CDATA[
36 protected function _run()
38 include func_get_arg(0);
43 こうすることで、ビュースクリプトが現在のオブジェクト
44 (<varname>$this</varname>) および <emphasis>そのオブジェクトの
45 すべてのメソッドやメンバー</emphasis> にアクセスできるようになります。
46 多くの操作はアクセス制限されたメンバーの内容に依存しているので、
48 ビュースクリプトから、アクセス制限されたメソッドを直接コールしたり
49 重要なプロパティを直接変更してしまったりもできてしまうということです。
50 もしうっかりスクリプトが <varname>$_path</varname> や
51 <varname>$_file</varname> を変更してしまったら、それ以降の
52 <methodname>render()</methodname> やビューヘルパーのコールは正常に動作しなくなります。
56 幸いなことに、<acronym>PHP</acronym> 5 では可視性を宣言することでこの問題を回避できます。
57 private 宣言されたメンバーは、そのクラスを継承したオブジェクトからは
58 アクセスできなくなるのです。このおかげで現在の設計が可能となりました。
59 <classname>Zend_View</classname> は <classname>Zend_View_Abstract</classname>
60 を <emphasis>継承した</emphasis> クラスなので、
61 <classname>Zend_View_Abstract</classname> のメソッドやメンバーのうち
62 ビュースクリプトからアクセスできるのは protected あるいは public
63 なものだけです。これで、ビュースクリプトができることを効率的に制限できるようになり、
64 重要な場所をビュースクリプトから保護できるようになりました。