1 <?xml version="1.0" encoding="UTF-8"?>
3 <!-- EN-Revision: 16674 -->
4 <sect1 id="zend.config.theory_of_operation">
8 <classname>Zend_Config</classname> のコンストラクタを通じて、
9 設定データに連想配列形式でアクセスできるようになります。
11 これによって汎用的なデータから何かに固有のデータまで扱えるようになります。
13 どこかに保存されているデータを読み込んでこの連想配列形式を作成し、
14 し、<classname>Zend_Config</classname> のコンストラクタに渡すことです。
16 <classname>Zend_Config</classname> のコンストラクタに渡すことも可能です。
18 場合によってはこのような方式のほうが適切なこともあるでしょう。
22 設定データ配列の値が、それぞれ <classname>Zend_Config</classname>
23 オブジェクトのプロパティとなります。配列のキーがプロパティ名となります。
24 配列の値自身がまた配列であった場合、対応するプロパティの値は新しい
25 <classname>Zend_Config</classname> オブジェクトとなります。この中に配列の内容が読み込まれます。
27 階層構造になっている設定データは任意のレベルでこの構造が繰り返されることになります。
31 <classname>Zend_Config</classname> は内部で <emphasis>Countable</emphasis>
32 インターフェイスおよび <emphasis>Iterator</emphasis>
34 これを使用して設定データに容易にアクセスできるようになっています。
35 つまり、<classname>Zend_Config</classname> オブジェクトに対して
36 <ulink url="http://php.net/count"><methodname>count()</methodname></ulink>
37 関数や <ulink url="http://php.net/foreach"><emphasis>foreach</emphasis></ulink>
42 デフォルトでは、<classname>Zend_Config</classname>
43 で利用できる設定データは読み込み専用です。代入
44 (<command>$config->database->host = 'example.com';</command> など)
45 を行おうとすると例外がスローされます。しかし、
46 コンストラクタでこの振る舞いを変更し、データの変更を許可することも可能です。
47 また、変更を許可した場合には、<classname>Zend_Config</classname>
49 (<methodname>unset($config->database->host)</methodname> とします)。
50 <methodname>readOnly()</methodname> メソッドを使用すると、
51 指定した <classname>Zend_Config</classname> オブジェクトの変更が許可されているかどうかを取得することができます。
52 また <methodname>setReadOnly()</methodname> メソッドを使用すると、
53 変更を許可する設定だった <classname>Zend_Config</classname>
54 オブジェクトに対してそれ以降の変更を禁じることができます。
59 メモリ上で変更したデータを何らかのメディアに保存しようとする際に、
61 作成したり変更したりした設定データをメディアに保存する機能は、今のところ
62 <classname>Zend_Config</classname> の対象範囲外です。
63 設定データを作成・編集してメディアに保存するには、
64 サードパーティからオープンソースのソリューションが提供されています。
69 <classname>Zend_Config</classname> クラスを継承したアダプタクラスが、
74 <classname>Zend_Config</classname> ファミリーのクラスを使用すると、
75 設定データをセクション単位でまとめることができます。
76 <classname>Zend_Config</classname> オブジェクトの特定のセクションだけを読み込んだり、
77 複数のセクションを指定して読み込んだり、あるいは
78 (何も指定しなければ) 全セクションを読み込んだりといったことが可能です。
82 <classname>Zend_Config</classname> は単一継承モデルをサポートしており、
83 設定データの特定のセクションを別のセクションに継承させることができます。
85 さまざまな目的のために設定データを二重管理する必要をなくすためです。
86 継承したセクションでは、親セクションから継承した値を上書きすることができます。
87 <acronym>PHP</acronym> のクラス継承と同様に、あるセクションが親セクションを継承し、
88 そのセクションがまた上位セクションを継承し、といったことが可能です。
89 しかし多重継承 (例えば、セクション C がセクション A およびセクション B
90 のふたつを直接継承するなど) はサポートされていません。
94 ふたつの <classname>Zend_Config</classname> オブジェクトがある場合に、
95 <methodname>merge()</methodname> 関数でそれをひとつにまとめることができます。
96 たとえば、<varname>$config</varname> と <varname>$localConfig</varname>
97 がある場合に <varname>$localConfig</varname> のデータを <varname>$config</varname>
98 に統合するには <command>$config->merge($localConfig);</command> とします。
99 <varname>$localConfig</varname> の中に <varname>$config</varname>
100 と同名の項目がある場合は、もとの値は上書きされます。
105 <classname>Zend_Config</classname> オブジェクトをまとめる場合は、
106 変更を許可する設定で作成する必要があります。つまり、
107 コンストラクタの 2 番目のパラメータに <constant>TRUE</constant> を渡します。
108 まとめが完了した後で <methodname>setReadOnly()</methodname>
109 メソッドを使用すると、それ以降の変更を禁じることができます。