Autoloading no PHP - Um poder desconhecido

Essa é a função menos explorada do PHP5. Vou explicar o porquê.
Sempre que vejo alguma página sobre a função autoload do PHP, leio algo parecido com isso:
PHP
<?php
function __autoload($classe) {
require_once($classe.'.class.php');
}
?>
Essa função faz com que qualquer classe chamada que ainda não esteja declarada, carregue o arquivo nomedaclasse.class.php. Ótimo, mas só isso? Esse não é o verdadeiro potencial dessa classe. Dá uma olhada nesse exemplo:
PHP
<?php
function __autoload($classe) {
eval('class '.$classe.' extends minhaClasse { } ');
}
class minhaClasse { }
?>
Aqui fizemos algo um pouco diferente. Qualquer classe chamada que ainda não esteja declarada, é declarada instantaneamente como uma extensão da classe minhaClasse. Podemos colocar qualquer coisa dentro da função __autoload().
PHP
<?php
function __autoload($reqClass)
{
if (!preg_match("#(Model|View|Controller){1}$#", $reqClass, $fragment));
$reqName = substr($reqClass, 0, strlen($reqClass)-strlen($fragment[1]));
eval(’class ‘.$reqClass.’ extends base’.$fragment[1].’ { protected $__name = ‘.$reqName.’; }’);
}
class baseModel {}
class baseView {}
class baseModel {}
?>
Nesse último exemplos temos algo ainda mais complexo. Ele divide os nomes das classes em duas partes, prefixos e sulfixos. Nesse caso eu determinei três sulfixos (Model, View, Controller). Sempre que uma classe for chamada com a síntaxe nomeSulfixo, a função extende uma determinada classe base. Se uma classe produtosView for chamada, ela imediatamente será uma extensão da classe baseView, e o objeto será instanciado instantaneamente, assim como nos demais sulfixos.
Isso particularmente me chamou atenção por transformar o PHP em uma máquina de frameworks. Você pode escrever uma classe genérica como base e criar uma regra base pra nomear objetos que a extendem. Na verdade, foi exatamente nessa idéia que eu comecei a criar o meu próprio framework, por estar frustrado com todos os demais.
Logicamente, encontrei uma barreira natural do PHP. Ao usar esse esquema com o eval, o PHP interpreta os prefixos das classes como tokens de constantes! Um mega-bug. Corrigi isso declarando os prefixos como constantes pouco antes de instanciar os objetos:
PHP
<?php
function __autoload($reqClass)
{
if (!preg_match("#(Model|View|Controller){1}$#", $reqClass, $fragment));
$reqName = substr($reqClass, 0, strlen($reqClass)-strlen($fragment[1]));
eval('class '.$reqClass.' extends openIdeo'.$fragment[1].’ { protected $__name = ‘.$reqName.’; }’);
/*hack pro constant bug*/ if (!defined($reqName)) define($reqName, $reqName);
}
?>
Bom, é isso. Abusem de uma das melhores características do PHP5 com orgulho, usem meu código (me citando, claro) à vontade! Aceito críticas, sugestões e possíveis elogios! ![]()


18/6/2007 às 11:27 pm
Puxa, parabéns. Não sabia que essa função poderia gerar frameworks pessoais.
9/11/2007 às 8:35 am
[...] funcionamento é parecido com o núcleo do framework anterior, apenas não há o autoCoolMagicAutoloading. Você pode baixar o arquivo (é um só, sem exemplos, brevemente comentado) aqui mesmo. Ah, mudei [...]
21/8/2008 às 7:47 pm
Cara muito legal.
Facilita muito.