Você está na página 1de 4

Normalmente, um programador que começa a utilizar PHP estrutura suas primeiras aplicações de

forma sequencial. Basicamente cria um diretório e vai jogando tudo lá dentro. Aos poucos, percebe
que a estratégia adotada vai ficando confusa, comaça a aparecer alguns arquivos chamados
index2.php, index3.php, salvar46.php, etc. e fica cada vez mais difícil achar aquilo que queria. Este
artigo trata de algumas técnicas e estratégias para tornar o desenvolvimento de uma aplicação mais
simples em termos de manutenção e, principalmente, expansão.

A caminhada de um bom programador passa por alguns tropeços como estes, mas a conquista
ocorre quando há vontade de mudar.

Para começar, estruturar os diretórios da aplicação de forma hierárquica é fundamental e impactará


em todo o desenvolvimento da mesma. Organizar e padronizar onde ficarão as classes, onde ficarão
as folhas de estilos, onde ficarão as imagens, onde ficarão os scripts acessíveis na Web é uma tarefa
aparentemente simples, mas pode se tornar bastante complexa em alguns cenários. Por exemplo, se
o seu sistema terá suporte à internacionalização ou não, são detalhes que precisam ser tomados de
antemão, já que reestruturar seu sistema para suportar isso é algo bem trabalhoso.

Um exemplo de como estruturar a árvore de diretórios é a seguinte:

• /sistema

• /classes

• /modelo
• /visao
• /controle
• /autenticacao
• ...

• /temas

• tema1

• /imagens

• tema2

• /imagens

• ...

• /imagens

• /icones
• /fotos
• ...

• /javascript
• /modulos

• modulo1

• submodulo1

• modulo2
• ...

Os nomes dos diretórios são autoexplicativos. Algumas observações importantes: o diretório de


classes pode ser subdividido hierarquicamente. O nível hierárquico não precisa ser,
necessariamente, em apenas 2 níveis de diretórios. Com o lançamento do PHP 5.3, veio o suporte a
namespaces, que possibilita montar funções de autoload mais sofisticadas, e baseadas na estrutura
hierárquica de diretórios (semelhante à linguagem Java, com utilização de pacotes).

De forma semelhante, o diretório de módulos (diretório onde ficam os arquivos acessíveis pela
Web) pode ser dividido hierarquicamente. Por exemplo, existir um módulo chamado "categorias",
que possui os arquivos "index.php", "exibir.php", "inserir.php", "alterar.php" e "excluir.php" (nomes
auto-explicativos). Dentro deste módulo, pode existir um submódulo chamado "livros". Neste
submódulo, poderiam ter arquivos com os mesmos nomes que o anterior, só que trabalhariam com
os livros de determinada "categoria".

Criar um diretório de temas é interessante para aplicações que pretendem dar este tipo de suporte. É,
no entanto, uma boa prática separar código HTML de estilos, independentemente da questão do
suporte a múltiplos temas.

Existem vários outros pontos onde é aplicada a estruturação de forma hierárquica. Uma delas é na
utilização de dados em sessão (session). PHP oferece uma variável superglobal chamada
$_SESSION e qualquer script pode definir/obter valores nesta variável que guarda um vetor
associativo.

Uma técnica que garante que um determinado dado armazenado em sessão por um arquivo não seja
sobrescrito por outro (por terem utilizado o mesmo índice do vetor), é padronizar a forma de
indexação do vetor.

Uma estratégia simples, mas pouco usual, é utilizar o nome completo do arquivo como índice do
vetor. Um exemplo é apresentado abaixo:

Arquivo a.php
...
$_SESSION[__FILE__]['x'] = 1;
...

Arquivo b.php
...
$_SESSION[__FILE__]['x'] = 1;
...
Note que, aparentemente, os dois arquivos armazenam dados na mesma posição de $_SESSION,
porém, isso não ocorre. A constante __FILE__ é uma constante mágica do PHP e ela sempre guarda
o nome do arquivo corrente. Logo, o primeiro arquivo armazena um valor em
$_SESSION['/.../a.php']['x'], enquanto o segundo armazena em $_SESSION['/.../b.php']['x'] (os três
pontos indicam um caminho absoluto até os arquivos). Esta técnica é útil quando você quer usar
dados em sessão apenas para o arquivo corrente. Embora ele seja visível para outros scripts, você ao
menos tem o controle sobre o que é sobrescrito propositalmente e o que não.

Porém, usar o nome completo do arquivo precisa armazenar um índice com tamanho muito grande
e, além disso, pode ser pouco amigável quando o valor precisa ser compartilhado entre vários
scripts. Uma solução, é definir (padronizar) os "índices de primeiro nível", ou seja, os índices
diretos da variável $_SESSION. Podemos, por exemplo, definir índices diretos como sendo:
"classes", "modulos", etc. Assim, se uma classe precisar guardar algo em sessão, ele guarda desta
forma:
...
$_SESSION['classes'][__CLASS__]['x'] = 1;
...

Note que __CLASS__ também é uma constante mágica do PHP e guarda sempre o nome da classe
onde a constante foi usada.

Se algum script do módulo "categorias" precisar guardar algo em sessão, ele pode fazer assim:
...
$_SESSION['modulos'][$modulo]['x'] = 1;
...

Tal que a variável $modulo deve guardar o nome do módulo corrente.

Para tudo isso, foi utilizado apenas o conceito de vetores multidimensionais. Ou seja, vetores que
armazenam outros vetores.

A mesma idéia aplicada em $_SESSION pode ser aplicada a outros elementos. Por exemplo, para as
variáveis superglobais $_GET e $_POST. Quando montamos um formulário que envia muitos
dados, e envolvem atributos de diferentes entidades da aplicação, pode ocorrer de um mesmo nome
de atributo ser igual para duas entidades. Para realizar a diferenciação, vamos hierarquizar o
formulário também.

Vamos supor um formulário que pretende-se cadastrar um usuário e o nome de um livro ao mesmo
tempo (duas entidades diferentes no mesmo formulário). Vamos supor, também, que tanto usuário
quanto livro possui o atributo "nome". Um formulário que contorna este problema ficaria assim:

<form method="post" action="...">


<fieldset>
<legend>Dados de Usuário</legend>
<p>
<label for="usuario-nome">Nome:</label>
<input name="usuario[nome]" id="usuario-nome" type="text" value="..." />
</p>
<p>
<label for="usuario-senha">Senha:</label>
<input name="usuario[senha]" id="usuario-senha" type="password" />
</p>
</fieldset>
<fieldset>
<legend>Dados do Livro</legend>
<p>
<label for="livro-nome">Nome:</label>
<input name="livro[nome]" id="livro-nome" type="text" value="..." />
</p>
<p>
<label for="livro-edicao">Edição:</label>
<input name="livro[edicao]" id="livro-edicao" type="texto" value="..." />
</p>
</fieldset>
<p><input type="submit" value="Enviar" /></p>
</form>

Observe que foi utilizado colchetes nos names dos campos. Desta forma, o PHP coloca os dados no
vetor $_POST de forma hierárquica. Por exemplo, para obter o nome do usuário seria acessada a
posição $_POST['usuario']['nome'], enquanto que para obter o nome do livro teriamos que acessar
$_POST['livro']['nome'].

Colocar prefixos também funciona, porém, para realizar algumas operações mais genéricas com
PHP, provavelmente será interessante manter o nome original do atributo. Opcionalmente, é
possível criar uma classe que constrói formulários e define um ID único para cada campo, de forma
que mesma classe consiga devolver, de forma hierárquica, os nomes utilizados no formulário.
Enfim, realizar um mapeamento a um nível de objeto.

Existem muitas outras situações onde poderia ser aplicada a idéia de estruturação de forma
hierárquica. Ao começar qualquer "parte" da aplicação, lembre-se sempre da situação mostrada no
início deste artigo e faça algumas perguntas para si próprio: quando isso que estou fazendo
expandir, será fácil dar manutenção? Será que vou encontrar tudo que quero de maneira ágil? Será
que outras pessoas também conseguirão entender? Será que uma parte não afetará negativamente o
comportamento de outra?

Enfim, pense de forma hierárquica e possibilite expansão com facilidade!