# Teoria de Operação

Dados de configuração são disponibilizados para o construtor `Zend_Config` 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 `Zend_Config`. Scripts do usuário poderão fornecer matrizes diretamente para o construtor `Zend_Config`, sem usar uma classe adaptadora, visto que pode ser conveniente em determinadas situações.

Cada dado de configuração de cada valor da matriz torna-se uma propriedade do objeto `Zend_Config`. 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 `Zend_Config`, 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.

`Zend_Config` implementa as interfaces Countable e Iterator, a fim de facilitar o acesso simplificado aos dados de configuração. Assim, pode-se usar a função `count()` e construtores do PHP como foreach com os objetos `Zend_Config`.

Por padrão, os dados de configuração disponibilizados através de `Zend_Config` são somente leitura, e uma atribuição (por exemplo, `$config->database->host = 'example.com';`) 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, `Zend_Config` suporta a desativação dos valores (ou seja, `unset($config->database->host)`). O método `readOnly()` pode ser usado para determinar se as modificações para um determinado objeto `Zend_Config` são permitidas e o método `setReadOnly()` pode ser usado para interromper quaisquer alterações posteriores a um objeto `Zend_Config` que foi criado permitindo modificações.

É 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 `Zend_Config`. Soluções de código aberto de terceiros estão prontamente disponíveis para esta finalidade.

Classes adaptadoras herdam da classe `Zend_Config` visto que utilizam a sua funcionalidade.

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

Classes adaptadoras `Zend_Config` 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 PHP, 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.

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

O objeto `Zend_Config` que está executando a fusão deve ter sido construído permitindo modificações, passando `TRUE` como o segundo parâmetro do construtor. O método `setReadOnly()` pode então ser usado para impedir quaisquer alterações posteriores, após a fusão estiver completa.