Sunday, November 8, 2009

__autoload l'include killer de php

Php dans sa version 5 a une fonctionnalité tres intérressante __autoLoad.

Voici une description de cette fonctionnalité :
Vous pouvez définir la fonction __autoload() qui va automatiquement être appelée si une classe n'est pas encore définie au moment de son utilisation. Grâce à elle, vous avez une dernière chance pour inclure une définition de classe, avant que PHP ne déclare une erreur.

L'idée est de faire un seul fichier php qui va gérer le lien entre nom de classe et aussi fichier ou cette classe est déclarée.
Apres dans toute votre application vous n'aurez besoin de d'appeller que ce meme et seul fichier.
Ainsi vous optimiserez le chargement de classe php dynamiquement.

Vous le code permettant de génerer le fameux fichier ici class/autoload, en imaginant que vos classes sont dans le repertoire class:

$phpFile = scandir("class");

$result ="foreach($phpFile as $filename)
{
if ($filename != ".." && $filename != ".")
{
$content = file_get_contents("class/".$filename);
while(true)
{
if(eregi("class ([a-z_A-Z0-9]+)([ \n\t]+){",$content,$regs))
{
$result .= "\$";
$result .= "arrayClassFilename[\"".$regs[1]."\"] = \"".$filename."\";\n";
$content = substr(stristr($content,"class "),5);
}
else
{
if(eregi("class ([a-z_A-Z0-9]+)([ \n\t]*) extend",$content,$regs))
{
$result .= "\$";
$result .= "arrayClassFilename[\"".$regs[1]."\"] = \"".$filename."\";\n";
$content = substr(stristr($content,"class "),5);
}
else
{
break;
}
}
}
}


}
$result.="\nfunction __autoload(\$class_name) {
global \$arrayClassFilename;
if (isset(\$arrayClassFilename[\$class_name]))
{
require_once \"class/\".\$arrayClassFilename[\$class_name];
}
}
?>";
file_put_contents("class/autoload.php",$result);
?>