Karedas.net: Couleur 45° sans essorage

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é.
PHP

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.

  • 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.

  • sympa , j’en ai un en ajax à proposer :
    http://blog.jaycreation.net/po.....nistration

Vous pouvez suivre les commentaires pour cet article via ce flux RSS 2.0.