[PHP] Objectos Mágicos: Função __autoload() - Tutoriais - Portugal-a-Programar
[PHP] Objectos Mágicos: Função __autoload()
Por MX+, 20 de Agosto de 2007 em Tutoriais
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 incluída 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 incluí-las com ficheiros externos.
require_once "class/mysql.php";
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.
require_once "class/{$class_name}.php";
$SQL	   = new MySQL;
$Templates = new Smarty;
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.
$ficheiro = str_replace("_", "\\", $classe);
$ficheiro = "class/{$ficheiro}.php";
if ( !file_exists($ficheiro) )
$log   = fopen("error_log.txt", "a");
$data  = date("Y/m/d H:i:s");
$texto = "[{$data}] {$classe} não encontrada; Ficheiro {$ficheiro}\n";
fwrite($log, $texto);
require_once $ficheiro;
$DB	   = new Database_MySQL;
$Template = new Template_Smarty;
# ... Resto Codigo
echo "Bibliotecas abertas com sucesso..";
Excelente, não tinha conhecimento disto!
Mas isto só se faz uma vez e ele fica incluido em todos os ficheiros que eu trabalhar ?!
Se usares uma estrutura como a do SMF, basta fazeres isso no index.php.
O problema de incluíres um ficheiro com os includes das classes todas que tens é que estas a obrigar o php a lêr ficheiros e definir classes que não vais precisar e isso em termos de performance e gestão de recursos da máquina nem sempre é desejável
com o __autoload() o ficheiro da classe só é incluído se a classe for usada
O problema de incluíres um ficheiro com os includes das classes que todas que tens é que estas a obrigar o php a lêr ficheiros e definir classes que não vais precisar e isso em termos de performance e gestão de recursos da máquina nem sempre é desejável