<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="zend.config.theory_of_operation">
    <title>Teoria de Operação</title>

    <para>
        Dados de configuração são disponibilizados para o construtor
        <classname>Zend_Config</classname> através de uma matriz associativa, que pode ser
        multi-dimensional, a fim organizar os dados do geral ao específico. Classes adaptadoras
        específicas adaptam os dados de configuração armazenados para produzir uma matriz
        associativa para o construtor <classname>Zend_Config</classname>. Scripts do usuário
        poderão fornecer matrizes diretamente para o construtor <classname>Zend_Config</classname>,
        sem usar uma classe adaptadora, visto que pode ser conveniente em determinadas situações.
    </para>

    <para>
        Cada dado de configuração de cada valor da matriz torna-se uma propriedade do objeto
        <classname>Zend_Config</classname>. A chave é usada como o nome da propriedade. Se um valor
        é também uma matriz, então a propriedade do objeto resultante é criada como um novo objeto
        <classname>Zend_Config</classname>, carregado com os dados da matriz. Isso ocorre
        recursivamente, tal como uma hierarquia de dados de configuração podendo ser criados com
        qualquer número de níveis.
    </para>

    <para>
        <classname>Zend_Config</classname> implementa as interfaces <emphasis>Countable</emphasis>
        e <emphasis>Iterator</emphasis>, a fim de facilitar o acesso simplificado aos dados de
        configuração. Assim, pode-se usar a função
        <ulink url="http://php.net/count"><methodname>count()</methodname></ulink>
        e construtores do <acronym>PHP</acronym> como
        <ulink url="http://php.net/foreach"><emphasis>foreach</emphasis></ulink>
        com os objetos <classname>Zend_Config</classname>.
    </para>

    <para>
        Por padrão, os dados de configuração disponibilizados através de
        <classname>Zend_Config</classname> são somente leitura, e uma atribuição (por exemplo,
        <command>$config->database->host = 'example.com';</command>) resulta em uma exceção. Esse
        comportamento padrão pode ser anulado através do construtor, no entanto, permitindo apenas
        a modificação dos valores dos dados. Além disso, quando as modificações são permitidas,
        <classname>Zend_Config</classname> suporta a desativação dos valores (ou seja,
        <methodname>unset($config->database->host)</methodname>). O método
        <methodname>readOnly()</methodname> pode ser usado para determinar se as modificações para
        um determinado objeto <classname>Zend_Config</classname> são permitidas e o método
        <methodname>setReadOnly()</methodname> pode ser usado para interromper quaisquer alterações
        posteriores a um objeto <classname>Zend_Config</classname> que foi criado
        permitindo modificações.
    </para>

    <note>
        <para>
            É importante não confundir alterações em memória com dados de configuração salvos em
            mídia específica de armazenamento. Ferramentas para criar e modificar dados de
            configuração em diversas mídia de armazenamento estão fora do escopo em relação ao
            <classname>Zend_Config</classname>. Soluções de código aberto de terceiros estão
            prontamente disponíveis para esta finalidade.
        </para>
    </note>

    <para>
        Classes adaptadoras herdam da classe <classname>Zend_Config</classname> visto que utilizam
        a sua funcionalidade.
    </para>

    <para>
        A família de classes <classname>Zend_Config</classname> permite que os dados de
        configuração sejam organizados em seções. Os objetos adaptadores
        <classname>Zend_Config</classname> podem ser carregados com uma única seção especificada,
        várias seções especificadas, ou todas as seções (se nenhum for especificado).
    </para>

    <para>
        Classes adaptadoras <classname>Zend_Config</classname> suportam um modelo de herança única
        que permite que dados de configuração sejam herdados de uma seção de dados de configuração
        para outra. Isso é oferecido de forma a reduzir ou eliminar a necessidade de duplicação dos
        dados de configuração para diferentes fins. Uma seção herdada também pode substituir os
        valores que ela herda através de sua seção pai. Como a herança de classe no
        <acronym>PHP</acronym>, uma seção pode herdar de uma seção pai, que pode herdar de uma
        seção avó, e assim por diante, mas a herança múltipla (ou seja, seção C herdando
        diretamente das seções pais A e B) não é suportada.
    </para>

    <para>
        Se você tem dois objetos <classname>Zend_Config</classname>, você pode juntá-los em um
        único objeto usando a função <methodname>merge()</methodname>. Por exemplo, dados
        <varname>$config</varname> e <varname>$localConfig</varname>, você poderá unificar os
        dados de <varname>$localConfig</varname> para <varname>$config</varname> usando
        <command>$config->merge($localConfig);</command>. Os itens em
        <varname>$localConfig</varname> serão substituídos por quaisquer itens
        com mesmo nome em <varname>$config</varname>.
    </para>

    <note>
        <para>
            O objeto <classname>Zend_Config</classname> que está executando a fusão deve ter sido
            construído permitindo modificações, passando <constant>TRUE</constant> como o segundo
            parâmetro do construtor. O método <methodname>setReadOnly()</methodname> pode então ser
            usado para impedir quaisquer alterações posteriores, após a fusão estiver completa.
        </para>
    </note>
</sect1>
<!--
vim:se ts=4 sw=4 et:
-->
