Autoload php explorant l’arborescence d’un repertoire
Je vais vous présenter mon autoload qui utilise la classe DirectoryIterator dans une fonction récursive pour explorer le répertoire où se trouve les classes, on est ainsi libre d’organiser les fichiers de classes comme bon nous semble pour une meilleure clarté.

Tout d’abord la source, et j’explique le tout dans 60 lignes:
//definition du dossier contenant les classes define(CLASS_DIRECTORY,'classes'); define(CLASS_EXTENSION,'.php'); /** * Recherche d'un fichier dans un dossier et son arborescence * @param str $dir dossier ou chercher * @param str $filename nom du fichier a chercher * @return str chemin complet du fichier ou bool false si introuvable */ function searchFile($dir,$filename) { //si pas de slash final on l'ajoute $last = $dir[strlen($dir)-1]; if($last != '/' && $last != '\\') { $dir .= '/'; } //chargement dossier $filelist = new DirectoryIterator($dir); //on boucle le contenu foreach($filelist as $file) { //si . ou .. on zappe if ($file->isDot()) { continue; } //si dir on explore if($file->isDir()) { //si on trouve on renvoi if($res = searchFile($dir.$file->getFilename(),$filename)) { return $res; //sinon on continue } else { continue; } } //si on a un fichier correspondant à ce qu'on cherche, on le renvoi if($file->getFilename() == $filename) { return $dir.$file->getFilename(); } } //si on a rien trouvé on renvoi faux return false; } /** * Autoload de classes * @param str $class_name nom de la classe * @return bool */ function __autoload($class_name) { //test sur racine des classes if($file = searchFile(CLASS_DIRECTORY,$class_name.CLASS_EXTENSION)) { include_once $file; return true; } //si fichier non trouvé, la classe n'existe pas, on leve une exception throw new Exception('Classe '.$class_name.' introuvable.'); return false; } |
Dans les 2 premières lignes, je défini le répertoire principal ou se trouves l’arborescence des classes, et l’extension des fichiers contenant les classes, pour ceux qui voudraient les mettre dans des fichiers .txt ou, plus courant .inc.php, ce sont les 2 seules lignes que vous aurez à modifier. Je précise, au cas où, que les fichiers contenant les classes devront porter le nom des classes, mais on pratique rarement autrement.
La fonction searchFile() va recherche un fichier dans toute l’arborescence d’un répertoire donné. Si elle le trouve, elle renvoi son chemin complet, si elle ne le trouve pas, elle renvoi faux. On aurait pu la mettre en statique dans une classe regroupant des fonctions concernant les fichiers, mais on aurait été bien embêté pour s’en servir dans l’autoload. Ceci dit rien n’empêche de le faire pour l’utiliser à d’autres endroits.
Vient enfin la fonction __autoload() qui va appeler searchFile() pour rechercher le fichier contenant la classe voulue, si le fichier existe elle l’inclue, si il n’existe pas elle va lever une exception.
Pour la mettre en place, rien de plus simple, modifiez les deux constantes dans les deux premières lignes, incluez ‘autoload.php’ au début de votre script et voilà, les classes se charges toutes seules.
Si vous avez des questions, remarques ou critiques, elles sont les bienvenues.

Guillaume
12 jan, 2010
Salut,
Super script. Pile ce que je cherchais !
Il y a juste deux petites modifs à faire:
define(’CLASS_DIRECTORY’,'classes’);
define(’CLASS_EXTENSION’,’.php’);
Il manquait les ‘ ‘ aux noms des variables.
Guillaume.
jaycreation
31 août, 2010
sympa , j’en ai un en ajax à proposer :
http://blog.jaycreation.net/po.....nistration