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.
1/7/2009 às 6:13 am
Parece que eu não fui o único que descobriu o potencial do autoloading, e também não fui o único frustrado com os frameworks e linguagens que estão ai no mercado, levando a fazer um framework próprio…
Cara, você não gostaria de montarmos uma comunidade afim de criar o framework definitivo pra web? O que nos falta é só atitude!
Olhe a forma que estou programando no meu framework, esse é um exemplo de formulário para adicionar/editar um post:
Posts::form($_GET['id']);A classe é gerada automaticamente, a função é um pattern Facade de uma outra classe chamada Form. Outro exemplo, para adicionar os dados do formulário no banco de dados:
Posts::post();Datagrid, com conceito de DSL:
Posts::datagrid()->align("center")->id("Datagrid");Dentre muitas outras coisas… pra mim os conceitos mais importantes são o DRY e o DSL. Também implementei classes como banco de dados com singletone, cache, session com singletone, conceito de templates, firewall, conceito de REST… e por ai vai…
Meu blog foi escrito em cima desse meu framework, ainda estou finalizando ele, falta muito pouco.
O que você acha de unirmos força? Entre em contato!!
“Que a força esteja com você”… hehehehe
6/3/2010 às 7:00 am
Acho que todos que querem criar seu proprio framework deveriam conhecer o kohana.