<?xml version="1.0" encoding="UTF-8"?>
    <!-- EN-Revision: 24249 -->
    <!-- Reviewed: no -->

<sect1 id="zend.config.theory_of_operation">
    <title>Aspectos Teóricos</title>
    <para> Los datos de configuración se hacen accesibles al constructor
            <classname>Zend_Config</classname> a través de un array asociativo,
        que puede ser multidimensional, para permitir organizar los datos desde
        lo general a lo específico. Las clases de adaptador concretas permiten
        construir una tabla asociativa para el constructor de
            <classname>Zend_Config</classname> a partir de un sistema de
        almacenamiento de datos de configuración. Algunos scripts de usuario
        pueden proveer esos arrays directamente al constructor Zend_Config, sin
        usar una clase adaptador, lo cual puede ser apropiado en ciertas
        ocasiones. </para>
    <para> Cada valor del array de datos de configuración se convierte en una
        propiedad del objeto <classname>Zend_Config</classname> . La clave es
        usada como el nombre de la propiedad. Si un valor es un array por sí
        solo, entonces la propiedad de objeto resultante es creada como un nuevo
        objeto <classname>Zend_Config</classname> , cargado con los datos del
        array. Esto ocurre recursivamente, de forma que una jerarquía de datos
        de configuración puede ser creada con cualquier número de niveles. </para>
    <para>
        <classname>Zend_Config</classname> implementa las interfaces
            <emphasis>Countable</emphasis> e <emphasis>Iterator</emphasis> para
        facilitar el aceso sencillo a los datos de configuración. Así, uno puede
        usar la función <ulink url="http://php.net/count">
            <methodname>count()</methodname>
        </ulink> y constructores <acronym>PHP</acronym> como <ulink
            url="http://php.net/foreach">
            <emphasis>foreach</emphasis>
        </ulink> sobre objetos <classname>Zend_Config</classname> . </para>
    <para> Por defecto, los datos de configuración permitidos a través de
            <classname>Zend_Config</classname> son de sólo lectura, y una
        asignación (e.g., <methodname>$config-&gt;database-&gt;host =
            'example.com'</methodname> ) provoca que se lance una excepción.
        Este comportamiento por defecto puede ser sobrescrito a través del
        constructor, sin embargo, para permitir la modificación de valores de
        datos. Además, cuando las modificaciones están permitidas,
            <classname>Zend_Config</classname> soporta el borrado de elementos
        (unset) (i.e.
            <methodname>unset($config-&gt;database-&gt;host);</methodname>
        ). El método <methodname>readOnly()</methodname> puede ser usado para
        determinar si las modificaciones a un objeto
            <classname>Zend_Config</classname> están permitidas y el método
            <methodname>setReadOnly()</methodname> puede ser usado para evitar
        cualquier modificación posterior a un objeto
            <classname>Zend_Config</classname> que fue creado con permiso de
        modificaciones.
    </para>
        <note>
            <para> Es importante no confundir tales modificaciones en memoria
                con guardar los datos de configuración a un medio de
                almacenamiento específico. Las herramientas para crear y
                modificar datos de configuración para distintos medios de
                almacenamiento están fuera del alcance de
                    <classname>Zend_Config</classname> . Existen soluciones
                third-party de código abierto con el propósito de crear y
                modificar datos de configuración de distintos medios de
                almacenamiento. </para>
        </note>

    <para> Las clases del adaptador heredan de la clase
            <classname>Zend_Config</classname> debido a que utilizan su
        funcionalidad. </para>
    <para> La familia de clases <classname>Zend_Config</classname> permite
        organizar en secciones los datos de configuración. Los objetos de
        adaptador <classname>Zend_Config</classname> pueden ser cargados con una
        sola sección especificada, múltiples secciones especificadas, o todas
        las secciones (si no se especifica ninguna). </para>
    <para> Las clases del adaptador <classname>Zend_Config</classname> soportan
        un modelo de herencia única que permite que los datos de configuración
        hereden de una sección de datos de configuración a otra. Esto es
        provisto con el fin de reducir o eliminar la necesidad de duplicar datos
        de configuración por distintos motivos. Una sección heredada puede
        también sobrescribir los valores que hereda de su sección padre. Al
        igual que la herencia de clases <acronym>PHP</acronym> , una sección
        puede heredar de una sección padre, la cual puede heredar de una sección
        abuela, etc..., pero la herencia múltiple (i.e., la sección C heredando
        directamente de las secciones padre A y B) no está permitida. </para>
    <para> Si tiene dos objetos <classname>Zend_Config</classname> , puede
        combinarlos en un único objeto usando la función
            <methodname>merge()</methodname> . Por ejemplo, dados
            <varname>$config</varname> y <varname>$localConfig</varname> , puede
        fusionar datos de <varname>$localConfig</varname> a
            <varname>$config</varname> usando
            <methodname>$config-&gt;merge($localConfig);</methodname> . Los
        ítemes en <varname>$localConfig</varname> sobrescribirán cualquier item
        con el mismo nombre en <varname>$config</varname> .
    </para>
        <note>
            <para> El objeto <classname>Zend_Config</classname> que está
                ejecutando el merge debe haber sido construido para permitir
                modificaciones, pasando <constant>TRUE</constant> como el
                segundo parámetro del constructor. El método
                    <methodname>setReadOnly()</methodname> puede entonces ser
                usado para evitar cualquier modificación posterior después de
                que el merge se haya completado. </para>
        </note>

</sect1>
