<commit_before><!-- EN-Revision: 11090 -->
<sect1 id="zend.config.theory_of_operation">
    <title>Theory of Operation</title>
    <para>
        Konfigurations-Daten werden dem <code>Zend_Config</code>-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 <code>Zend_Config</code>-Konstruktor,
        indem sie die Daten für diesen als Array aufbereiten. Es können auch direkt aus dem eigenen Code Arrays an
        den <code>Zend_Config</code>-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 <code>Zend_Config</code> 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 <code>Zend_Config</code> 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>
        <code>Zend_Config</code> 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 <code>Zend_Config</code>-Objekte
        anwenden.
    </para>
    <para>
        Standardmäßig gewährt <code>Zend_Config</code> 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
        <code>Zend_Config</code> das entfernen von Werten (z.B.
        <code>unset($config->database->host);</code>).

        <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 <code>Zend_Config</code>.
                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 <code>Zend_Config</code>-Klasse, da sie ihre Funktionalität nutzen.
    </para>
    <para>
        Die Familie der <code>Zend_Config</code>-Klassen ermöglicht es, Daten in Sektionen einzuteilen.
        Beim Initialisieren eines <code>Zend_Config</code>-Adapter-Objektes können eine einzelne spezifizierte
        Sektion, mehrere spezifizierte Sektionen oder alle Sektionen (wenn keine spezifiziert ist) geladen werden.
    </para>
    <para>
        Die <code>Zend_Config</code>-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 <code>Zend_Config</code> 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>.
    </para>
</sect1>
<!--
vim:se ts=4 sw=4 et:
--><commit_msg>German docu:  - sync up to r11515<commit_after><!-- EN-Revision: 11501 -->
<sect1 id="zend.config.theory_of_operation">
    <title>Theory of Operation</title>
    <para>
        Konfigurations-Daten werden dem <code>Zend_Config</code>-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 <code>Zend_Config</code>-Konstruktor,
        indem sie die Daten für diesen als Array aufbereiten. Es können auch direkt aus dem eigenen Code Arrays an
        den <code>Zend_Config</code>-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 <code>Zend_Config</code> 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 <code>Zend_Config</code> 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>
        <code>Zend_Config</code> 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 <code>Zend_Config</code>-Objekte
        anwenden.
    </para>
    <para>
        Standardmäßig gewährt <code>Zend_Config</code> 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
        <code>Zend_Config</code> 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 <code>Zend_Config</code> Objekt erlaubt sind und die
        <code>setReadOnly()</code> kann verwendet werden um weitere Änderungen an einem <code>Zend_Config</code>
        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 <code>Zend_Config</code>.
                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 <code>Zend_Config</code>-Klasse, da sie ihre Funktionalität nutzen.
    </para>
    <para>
        Die Familie der <code>Zend_Config</code>-Klassen ermöglicht es, Daten in Sektionen einzuteilen.
        Beim Initialisieren eines <code>Zend_Config</code>-Adapter-Objektes können eine einzelne spezifizierte
        Sektion, mehrere spezifizierte Sektionen oder alle Sektionen (wenn keine spezifiziert ist) geladen werden.
    </para>
    <para>
        Die <code>Zend_Config</code>-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 <code>Zend_Config</code> 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 <code>Zend_Config</code> 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:
-->
{'fraction_non_alphanumeric': 0.07837320574162679, 'fraction_numerical': 0.002200956937799043, 'mean_word_length': 3.2990538872891815, 'pattern_counts': {'":': 0, '<': 197, '<?xml version=': 0, '>': 207, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5147357', 'n_tokens_mistral': 3278, 'n_tokens_neox': 3322, 'n_words': 1033}