<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 15103 -->
<!-- Reviewed: no -->
<sect1 id="zend.config.theory_of_operation">
    <title>Theory of Operation</title>
    <para>
        Konfigurations-Daten werden dem <classname>Zend_Config</classname>-Konstruktor als
        assoziatives Array zur Verfügung gestellt. Das Array kann mehrdimensional sein, um die
        Übergabe geordneter Daten zu unterstützen. Spezifische Adapter fungieren als Schnittstelle
        zwischen der Datenhaltung und dem <classname>Zend_Config</classname>-Konstruktor, indem sie
        die Daten für diesen als Array aufbereiten. Es können auch direkt aus dem eigenen Code
        Arrays an den <classname>Zend_Config</classname>-Konstruktor übergeben werden, ohne eine
        Adapter-Klasse zu benutzen. In manchen Situationen kann das angebracht sein.
    </para>
    <para>
        Jeder Konfigurationswert des Arrays wird zu einer Eigenschaft des
        <classname>Zend_Config</classname> Objektes. Der Schlüssel wird als Name der Eigenschaft
        verwendet. Wenn ein Wert selbst ein Array ist, wird die resultierende Eigenschaft des
        Objektes selbst als ein neues <classname>Zend_Config</classname> Objekt erstellt und mit den
        Array Daten geladen. Das findet rekursiv statt, sodas hirarchische Konfigurationswerte mit
        einer beliebigen Anzahl an Level erstellt werden können.
    </para>
    <para>
        <classname>Zend_Config</classname> implementiert die Interfaces <code>Countable</code> und
        <code>Iterator</code> um den einfachen Zugriff auf Konfigurationsdaten zu gewährleisten.
        Dementsprechend kann man die <ulink
            url="http://php.net/count"><code>count()</code></ulink>-Funktion und auch PHP-Konstrukte
        wie <ulink url="http://php.net/foreach"><code>foreach</code></ulink> auf
        <classname>Zend_Config</classname>-Objekte anwenden.
    </para>
    <para>
        Standardmäßig gewährt <classname>Zend_Config</classname> nur Lesezugriff auf die Daten und
        der Versuch einer Wertzuweisung (wie z. B. <code>$config->database->host =
        'example.com';</code>) löst eine Ausnahme aus. Dieses Standard-Verhalten kann mit Hilfe des
        Konstruktors aber so überschrieben werden, dass die Veränderung von Daten erlaubt ist. Wenn
        auch Änderungen erlaubt sind, unterstützt <classname>Zend_Config</classname> das entfernen
        von Werten (z.B. <code>unset($config->database->host);</code>). Die <code>readOnly()</code>
        Methode kann verwendet werden um festzustellen ob Änderungen an einem gegebenen
        <classname>Zend_Config</classname> Objekt erlaubt sind und die <code>setReadOnly()</code>
        kann verwendet werden um weitere Änderungen an einem <classname>Zend_Config</classname>
        Objekt, das erstellt wurde und Änderungen erlaubt, zu verhindern.

        <note>
            <para>
                Es muss angemerkt werden, dass hierbei nur die Daten im Speicher verändert werden.
                Es wird keine Änderung an den Konfigurations-Daten auf dem Speichermedium
                vorgenommen. Werkzeuge zur Veränderung gespeicherter Konfigurations-Daten liegen
                nicht im Bereich von <classname>Zend_Config</classname>. Drittanbieter bieten
                bereits diverse Open-Source-Lösungen für das Erstellen und Verändern von
                Konfigurations-Datensätzen in verschienen Formaten.
            </para>
        </note>
    </para>
    <para>
        Adapter-Klassen erben von der <classname>Zend_Config</classname>-Klasse, da sie ihre
        Funktionalität nutzen.
    </para>
    <para>
        Die Familie der <classname>Zend_Config</classname>-Klassen ermöglicht es, Daten in Sektionen
        einzuteilen. Beim Initialisieren eines <classname>Zend_Config</classname>-Adapter-Objektes
        können eine einzelne spezifizierte Sektion, mehrere spezifizierte Sektionen oder alle
        Sektionen (wenn keine spezifiziert ist) geladen werden.
    </para>
    <para>
        Die <classname>Zend_Config</classname>-Adapter-Klassen unterstützen ein Modell einfacher
        Vererbung, welches es ermöglicht, dass Konfigurations-Daten aus einer Sektion an eine Andere
        vererbt werden können. Dadurch kann die Notwendigeit doppelter Konfigurations-Daten für
        verschiedene Einsatzgebiete reduziert oder beseitigt werden. Eine erbende Sektion kann die
        von der Eltern-Sektion geerbten Werte auch überschreiben. Wie auch bei der Klassen-Vererbung
        in PHP kann eine Sektion von einer Eltern-Sektion geerbt werden, die wiederum von einer
        Großeltern-Sektion geerbt hat und so weiter. Mehrfaches Erben (Beispielsweise der Fall, dass
        Sektion C direkt von den Eltern-Sektionen A und B erbt) wird dagegen nicht unterstützt.
    </para>
    <para>
        Wenn zwei <classname>Zend_Config</classname> Objekte vorhanden sind, können diese in ein
        einzelnes Objekt zusammengeführt werden indem die <code>merge()</code> Funktion verwendet
        wird. Angenommen es gibt <code>$config</code> und <code>$localConfig</code>, kann
        <code>$localConfig</code> in <code>$config</code> zusammengeführt werden indem
        <code>$config->merge($localConfig);</code> aufgerufen wird. Die Elemente in
        <code>$localConfig</code> überschreiben gleichnamige Elemente in <code>$config</code>.
        <note>
            <para>
                Das <classname>Zend_Config</classname> Objekt das die Zusammenführung durchführt muß
                so erstellt worden sein das es Änderungen erlaubt, indem dem Constructor
                <code>true</code> als zweiter Parameter übergeben wird. Die
                <code>setReadOnly()</code> Methode kann dann verwendet werden um weitere Änderungen
                zu verhindern nachdem die Zusammenführung fertiggestellt ist.
            </para>
        </note>
    </para>

</sect1>
<!--
vim:se ts=4 sw=4 et:
-->