Autoloading : la soluce symfony… sans symfony !

Php 5, les classes, c’est cool… Mais √ßa devient vite impossible √† ¬†g√©rer au niveau des require.¬†Je dis bien require, car une classe non trouv√©e et c’est une erreur fatale, sniff.

Heureusement, tous les frameworks offrent une soluce (ben oui, ils sont quant même les premiers concernés :-).
Mais si vous travailez sur un projet sans framework ? Eh bien, j’utilise pour cela 2 classes de la librairie du framework symfony (test√© jusqu’√† ¬†version 1.3/4).

include $root.'\lib\util\sfFinder.class.php';
include $root.'\lib\autoload\sfSimpleAutoload.class.php';

Vous placez ces deux fichiers dans ¬ę¬†C:\EasyPHP_3_0\autoload¬†¬Ľ.
Vous mettez toutes vos classes √† ¬†autoloader dans un dossier : disons ¬ę¬†C:\EasyPHP_3_0\lib¬†¬Ľ.
Il ne vous reste qu’√† ¬†ins√©rer le code suivant en d√©but de script pour avoir acc√©s √† toutes vos classes :

 $Autoloader = sfSimpleAutoload::getInstance();
 $Autoloader->addDirectory('C:\EasyPHP_3_0\www\php_solutions\autoload\simpleAutoload\lib', '.class.php');
 $Autoloader->register();

Et voil√† ¬†: toutes vos classes sont √† ¬†votre disposition ! Le deuxi√®me ar¬†deuxi√®me argument¬†‘.php’ est optionnel. Il permet d’acc√©l√©rer le processus d’autoloading en limitant la recherche aux fichiers en ‘.class.php’, etc. (par d√©faut, recherche limit√©e aux fichiers en .php).

Mise en cache

Pour acc√©l√©rer l’autoloading, une mise en cache (fichier) est possible.
Il vous suffit de passer un chemin absolu vers un fichier au moment de l’instanciation.

$autoload = sfSimpleAutoload::getInstance($cache);

Limite

Il n’est pas possible de lui faire mettre en cache qu’une partie des dossiers.
Cela concerne le rare cas o√Ļ une app va chercher la classe voulue dans des dossier diff√©rents en fonction d’un param√®tre (ex : selon le client appelant dans le cas d’un app de web-service).

 

Ce contenu a été publié dans développement, avec comme mot(s)-clé(s) , . Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *