Objectos Mágicos

Monday, 20 August 2007

Hoje vou apresentar uma função que a maior parte da comunidade PHP não conhece. Está englobada dentro das “funções mágicas”, foi íncluida no PHP5, mas é necessário defini-la.

Em projectos com uma escala média, em que contamos com mais do que alguns ficheiros é praticamente certo que vamos utilizar classes, e inclui-las com ficheiros externos.

<br></br><br></br>

Este é um exemplo típico duma aplicação simples/complexa. Incluímos o nosso ficheiro em todos as páginas em que vamos necessitar duma ligação à base-de-dados e em cada uma delas vamos iniciar o nosso objecto.

Agora podemos continuar a seguir a linha de pensamento, e para um projecto funcionar vai precisar também duma classe para gerir os utilizadores, outra, quem sabe, para gerir os templates - e para os mais exigentes, também podemos incluir uma para cache.

Vamos utilizar muito provavelmente uma página, normalmente denominada por kernel ou global, que vai incluir tudo isto por nós em todas as páginas, ou na única página, do nosso projecto.

Mas tudo fica mais simples se fizermos uso desta função. Imaginemos o seguinte pedaço de código, que representa literalmente como ficaria o nosso index:

<br></br><br></br>

Acho que já se tornou evidente as capacidades desta função. Quando criamos um novo objecto, se o interpretador não encontrar a class definida chama a função __autoload e passa como argumento o nome da class. Tudo o resto fica a cargo da nossa imaginação.

Esta função já é usado em frameworks do topo como codeignitor, cakephp e a recente, e aclamada, Zend Framework. Além disso está parcialmente provado que fica aproximadamente ~3.7x mais eficiente usar __autoload em vez de usar directamente o require_once.

Fica aqui um último exemplo de como eu uso esta função em algumas aplicações, tornando o meu código mais legível e incorporando um log de erros. Quando chamo uma class, cada ___ (underscore) representa um nível mais baixo em pastas, permitindo assim organizar facilmente módulos e classes.

<br></br><br></br>