# 動作原理

Zend_Config のコンストラクタを通じて、 設定データに連想配列形式でアクセスできるようになります。 多次元の連想配列となる可能性もあり、 これによって汎用的なデータから何かに固有のデータまで扱えるようになります。 具象アダプタクラスの機能は、 どこかに保存されているデータを読み込んでこの連想配列形式を作成し、 し、Zend_Config のコンストラクタに渡すことです。 スクリプト内で直接配列を作成し、それを Zend_Config のコンストラクタに渡すことも可能です。 この場合はアダプタクラスは使用しません。 場合によってはこのような方式のほうが適切なこともあるでしょう。

設定データ配列の値が、それぞれ Zend_Config オブジェクトのプロパティとなります。配列のキーがプロパティ名となります。 配列の値自身がまた配列であった場合、対応するプロパティの値は新しい Zend_Config オブジェクトとなります。この中に配列の内容が読み込まれます。 この処理は再帰的に行われるので、 階層構造になっている設定データは任意のレベルでこの構造が繰り返されることになります。

Zend_Config は内部で Countable インターフェイスおよび Iterator インターフェイスを実装しており、 これを使用して設定データに容易にアクセスできるようになっています。 つまり、Zend_Config オブジェクトに対して count() 関数や foreach などを使用できるということです。

デフォルトでは、Zend_Config で利用できる設定データは読み込み専用です。代入 (`$config->database->host = 'example.com';` など) を行おうとすると例外がスローされます。しかし、 コンストラクタでこの振る舞いを変更し、データの変更を許可することも可能です。 また、変更を許可した場合には、Zend_Config は値の設定の解除もサポートしています (unset($config->database->host) とします)。 readOnly() メソッドを使用すると、 指定した Zend_Config オブジェクトの変更が許可されているかどうかを取得することができます。 また setReadOnly() メソッドを使用すると、 変更を許可する設定だった Zend_Config オブジェクトに対してそれ以降の変更を禁じることができます。

メモリ上で変更したデータを何らかのメディアに保存しようとする際に、 ちょっと戸惑うかもしれません。 作成したり変更したりした設定データをメディアに保存する機能は、今のところ Zend_Config の対象範囲外です。 設定データを作成・編集してメディアに保存するには、 サードパーティからオープンソースのソリューションが提供されています。

Zend_Config クラスを継承したアダプタクラスが、 それぞれの内容に応じて機能を拡張します。

Zend_Config ファミリーのクラスを使用すると、 設定データをセクション単位でまとめることができます。 Zend_Config オブジェクトの特定のセクションだけを読み込んだり、 複数のセクションを指定して読み込んだり、あるいは (何も指定しなければ) 全セクションを読み込んだりといったことが可能です。

Zend_Config は単一継承モデルをサポートしており、 設定データの特定のセクションを別のセクションに継承させることができます。 この機能が提供されている理由は、 さまざまな目的のために設定データを二重管理する必要をなくすためです。 継承したセクションでは、親セクションから継承した値を上書きすることができます。 PHP のクラス継承と同様に、あるセクションが親セクションを継承し、 そのセクションがまた上位セクションを継承し、といったことが可能です。 しかし多重継承 (例えば、セクション C がセクション A およびセクション B のふたつを直接継承するなど) はサポートされていません。

ふたつの Zend_Config オブジェクトがある場合に、 merge() 関数でそれをひとつにまとめることができます。 たとえば、`$config` と `$localConfig` がある場合に `$localConfig` のデータを `$config` に統合するには `$config->merge($localConfig);` とします。 `$localConfig` の中に `$config` と同名の項目がある場合は、もとの値は上書きされます。

Zend_Config オブジェクトをまとめる場合は、 変更を許可する設定で作成する必要があります。つまり、 コンストラクタの 2 番目のパラメータに `TRUE` を渡します。 まとめが完了した後で setReadOnly() メソッドを使用すると、それ以降の変更を禁じることができます。