<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 16674 -->
<!-- Reviewed: no -->
<sect1 id="zend.config.theory_of_operation">
    <title>Aspect théorique</title>

    <para>
        Les données de configuration sont transmis au constructeur de
        <classname>Zend_Config</classname> sous la forme d'un tableau associatif, qui peut être
        multidimensionnel, afin de supporter une organisation des données du général vers le
        spécifique. Les classes d'adaptateur concrètes permettent de construire le tableau
        associatif pour le constructeur de <classname>Zend_Config</classname> à partir du système
        de stockage des données de configuration. Dans certaines utilisations spécifiques, les
        scripts de l'utilisateur peuvent fournir de tels tableaux directement
        au constructeur de <classname>Zend_Config</classname>, sans employer une classe
        d'adaptateur.
    </para>

    <para>
        Chaque valeur du tableau de données de configuration devient une propriété de l'objet
        <classname>Zend_Config</classname>. La clé est utilisée comme nom de propriété. Si une
        valeur est un tableau, alors la propriété d'objet résultante est créée comme un nouveau
        objet <classname>Zend_Config</classname>, chargé avec les données du tableau. Cela se
        déroule récursivement, tel qu'une hiérarchie de données de configuration peut être créée
        avec n'importe quel nombre de niveaux.
    </para>

    <para>
        <classname>Zend_Config</classname> implémente les interfaces <emphasis>Countable</emphasis>
        et <emphasis>Iterator</emphasis> afin de faciliter l'accès simple aux données de
        configuration. Ainsi, on peut employer la fonction
        <ulink url="http://fr.php.net/count"><methodname>count()</methodname></ulink>
        et des constructions de <acronym>PHP</acronym> telles que
        <ulink url="http://fr.php.net/foreach"><emphasis>foreach</emphasis></ulink> sur des objets
        <classname>Zend_Config</classname>.
    </para>

    <para>
        Par défaut, les données de configuration fournies par <classname>Zend_Config</classname> ne
        sont pas modifiables (lecture seule), et une affectation (par exemple,
        <command>$config->database->host = 'example.com';</command>) lèvera une exception. Ce
        comportement par défaut peut cependant être surchargé par le constructeur pour permettre la
        modification des valeurs de données. De plus, quand les modifications sont autorisées,
        <classname>Zend_Config</classname> supporte l'effacement de valeurs (c'est-à-dire
        <methodname>unset($config-&gt;database-&gt;host)</methodname>). La méthode
        <methodname>readOnly()</methodname> peut être utilisée pour déterminer si les modifications
        sont autorisés pour un objet <classname>Zend_Config</classname> donné et la méthode
        <methodname>setReadOnly()</methodname> peut être
        utilisée pour empêcher toute nouvelle modification d'un objet
        <classname>Zend_Config</classname> qui aurait été créé en autorisant le modifications.
    </para>

    <note>
        <para>
            Il est important de ne pas confondre des modifications en cours de script avec
            l'enregistrement des données de configuration dans le support de stockage
            spécifique. Les outils pour créer et modifier des données de configuration pour
            différents supports de stockage ne concernent pas
            <classname>Zend_Config</classname>. Des solutions tiers open-source sont facilement
            disponibles afin de créer et&#160;/&#160;ou de modifier les données de configuration
            pour différents supports de stockage.
        </para>
    </note>

    <para>
        Les classes d'adaptateur héritent de la classe de <classname>Zend_Config</classname> ce qui
        permet d'utiliser ses fonctionnalités.
    </para>

    <para>
        La famille des classes <classname>Zend_Config</classname> permet d'organiser les données de
        configuration en sections. Les classes d'adaptateur <classname>Zend_Config</classname>
        peuvent être chargées en spécifiant une section unique, des sections multiples, ou toutes
        les sections (si aucune n'est indiquée).
    </para>

    <para>
        Les classes d'adaptateurs <classname>Zend_Config</classname> supporte un modèle d'héritage
        simple qui permet à des données de configuration d'être héritées d'une section de données
        de configuration dans d'autres. Ceci afin de réduire ou d'éliminer le besoin de reproduire
        des données de configuration pour différents cas. Une section héritante peut également
        surchargée les valeurs dont elle hérite de sa section parente. Comme l'héritage des classes
        <acronym>PHP</acronym>, une section peut hériter d'une section parent, qui peut hériter
        d'une section grand-parent, et ainsi de suite, mais l'héritage multiple (c.-à-d., la
        section C héritant directement des sections parents A et B) n'est pas supporté.
    </para>

    <para>
        Si vous avez deux objets <classname>Zend_Config</classname>, vous pouvez les fusionner en
        un objet unique en utilisant la fonction <methodname>merge()</methodname>. Par exemple,
        prenons <varname>$config</varname> et <varname>$localConfig</varname>, vous pouvez fusionner
        <varname>$localConfig</varname> dans <varname>$config</varname> en utilisant
        <command>$config->merge($localConfig);</command>. Les éléments de
        <varname>$localConfig</varname> surchargeront les éléments nommés de la même manière dans
        <varname>$config</varname>.
    </para>

    <note>
        <para>
            L'objet <classname>Zend_Config</classname> qui réalise la fusion doit avoir été
            construit en autorisant les modifications, en fournissant <constant>TRUE</constant>
            en tant que second paramètre du constructeur. La méthode
            <methodname>setReadOnly()</methodname> peut être utilisée pour empêcher toute nouvelle
            modification après la fin de la fusion.
        </para>
    </note>
</sect1>
