<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<sect1 id="zend.config.theory_of_operation">
    <title>Теоретические основы работы с Zend_Config</title>

    <para>
        Конфигурационные данные передаются конструктору <classname>Zend_Config</classname>
        в виде ассоциативного массива, который может быть многомерным, что
        дает возможность организовывать данные от общего к частному. Классы
        адаптеров преобразуют конфигурационные данные из хранилища в
        ассоциативный массив для конструктора <classname>Zend_Config</classname>.
        Можно также передавать массивы непосредственно конструктору
        <classname>Zend_Config</classname>
        без использования класса адаптера, т.к. это может быть наиболее
        подходящим решением в некоторых ситуациях.
    </para>

    <para>
        Каждое значение массива конфигурационных значений становится свойством
        объекта <classname>Zend_Config</classname>. Ключ массива используется как имя
        свойства. Если значение само является массивом, то соответствующее
        свойство создается как объект <classname>Zend_Config</classname>, который
        заполняется данными этого массива. Это производится рекурсивно, т.о.,
        иерархия конфигурационных данных может иметь любой уровень вложенности.
    </para>

    <para>
        <classname>Zend_Config</classname> реализует интерфейсы <emphasis>Countable</emphasis>
        и <emphasis>Iterator</emphasis> для того, чтобы обеспечить простой доступ
        к конфигурационным данным. Поэтому с объектами
        <classname>Zend_Config</classname> можно использовать функцию
        <ulink url="http://php.net/count"><methodname>count()</methodname></ulink> и
        такие конструкции языка <acronym>PHP</acronym>, как
        <ulink url="http://php.net/foreach"><emphasis>foreach</emphasis></ulink>.
    </para>

    <para>
        По умолчанию через <classname>Zend_Config</classname> конфигурационные данные
        доступны только для чтения, и операция присваивания (например,
        <command>$config->database->host = 'example.com'</command>)
        вызовет исключение. Тем не менее, это поведение
        может быть отменено при вызове конструктора, и тогда
        можно будет изменять конфигурационные данные.
        Если модификации разрешены, то <classname>Zend_Config</classname> также
        поддерживает уничтожение значений
        (т.е. <methodname>unset($config->database->host)</methodname>).
        Метод <methodname>readOnly()</methodname> может использоваться для определения того,
        был ли разрешены модификации в данном объекте <classname>Zend_Config</classname>.
        Метод <methodname>setReadOnly()</methodname> запрещает все дальнейшие изменения в
        объекте <classname>Zend_Config</classname>, который был создан с разрешением
        изменений.
    </para>

    <note>
        <para>
            Важно не путать изменение данных в памяти с сохранением
            конфигурационных данных на физическом носителе данных. Создание
            и изменение конфигурационных данных на различных
            носителях данных не входит в сферу назначений <classname>Zend_Config</classname>.
            Для создания и изменения конфигурационных данных на различных
            носителях информации можно использовать
            сторонние разработки с открытым исходным кодом.
        </para>
    </note>

    <para>
        Классы адаптеров наследуют от класса <classname>Zend_Config</classname>,
        и, следовательно, имеют тот же функционал.
    </para>

    <para>
        Семейство классов <classname>Zend_Config</classname> позволяет
        организовывать конфигурационные данные, разбивая их на разделы.
        В объекты адаптеров <classname>Zend_Config</classname> можно загружать
        один определенный раздел, несколько разделов или все разделы
        данных (если не указан раздел).
    </para>

    <para>
        Классы адаптеров <classname>Zend_Config</classname> поддерживают единую модель
        наследования, которая позволяет одному разделу наследовать
        конфигурационные данные из другого. Это сделано для того, чтобы
        уменьшить или устранить необходимость дублирования конфигурационных
        данных разного назначения. Наследующий раздел может замещать данные,
        унаследованные от родительского раздела. Как и при наследовании классов PHP,
        раздел может наследовать от родительского раздела, который в свою очередь
        наследует от другого и т.д., но множественное наследование (т.е. раздел
        C наследует напрямую от разделов A и B) не поддерживается.
    </para>

    <para>
        Если вы имеете два объекта <classname>Zend_Config</classname>, то можете объединить
        их в один, используя функцию <methodname>merge()</methodname>. Например, имея
        <varname>$config</varname> и <varname>$localConfig</varname> вы можете объединить
        данные из <varname>$localConfig</varname> с данными из <varname>$config</varname>,
        используя <methodname>$config->merge($localConfig)</methodname>. Элементы
        из <varname>$localConfig</varname> при совпадении имен заменят собой элементы
        <varname>$config</varname>.
    </para>

    <note>
        <para>
            Объект <classname>Zend_Config</classname>, который выполняет объединение,
            должен быть создан с разрешением модификаций путем передачи
            <constant>TRUE</constant> в качестве второго параметра конструктора.
            После того, как объединение будет завершено, можно использовать
            метод <methodname>setReadOnly()</methodname> для предотвращения всех
            дальнейших изменений.
        </para>
    </note>
</sect1>
<!--
vim:se ts=4 sw=4 et:
-->
