Charger automatiquement vos classes avec __autoload

Pour garder une bonne organisation de ses classes, il est pratique de n’avoir qu’une seule classe par fichier. Le problème de ce genre d’organisation est qu’il faut souvent inclure de nombreux fichiers dans ses scripts. Encore pire, l’utilisation de include_once() et require_once() devient souvent obligatoire afin d’éviter les inclusions multiples. Ces deux fonctionnalités sont hélas très mauvaises pour les performances (surtout, mais pas que, si on utilise un système de cache d’opcode comme APC).

Heureusement, depuis la version 5 de PHP on peut définir une fonction magique nommée __autoload et qui se chargera de charger automatiquement les fichiers contenant les classes à la volée.

Pour pouvoir utiliser cette fonctionnalité, il faut avoir une certaine rigueur dans l’organisation de ses fichiers et dans la façon de nommer ses classes.

Voici un exemple de structure et de conventions que j’utilise pour mes sites :

Mes classes sont nommées en utilisant le style CamelCase majuscule. C’est-à-dire que les mots sont tous composés d’une première lettre en majuscule suive de minuscules. Les mots sont collés les uns aux autres. Exemples : MaClasse, Database, Pdf… .

Mes noms de fichiers contenant des classes sont composés uniquement de lettres minuscules et les mots sont séparés par des tirets-bas. Le nom du fichier se termine par le suffixe : « .class.php ». Exemples : ma_classe.class.php, database.class.php, pdf.class.php… .

Mes scripts PHP sont stockés dans un dossier nommé « core ». Une constante CORE_DIR est définie et contient le chemin absolu vers ce dossier.

Mes classes sont stockées dans trois sous dossiers contenus dans « core » :

  • « libs » pour les classes génériques
  • « controllers » pour les contrôleurs
  • « models » pour les modèles

Ma fonction __autoload devra donc effectuer les opérations suivantes :

  • Faire la correspondance entre le nom de la classe et le nom du fichier. MaClasse devient ma_classe.class.php
  • Vérifier si le fichier existe dans les 3 dossiers, l’un après l’autre.
  • Si le fichier est trouvé, l’inclure et renvoyer un booléen.

La fonction __autoload prend en argument le nom de la classe appelée. Elle doit renvoyer un booléen : TRUE si le fichier a été trouvé et inclut, FALSE dans le cas contraire.

Et voici le code de notre fonction __autoload correspondant à nos besoins :

function __autoload($class_name)
{
 // on converti le nom de la classe en nom de fichier.
 $base_name = strtolower(preg_replace('/(?<=[a-z])(?=[A-Z])/', '_', $class_name));
 $file_name = $base_name.'.class.php';
 
 // un tableau contenant nos chemins dans l'ordre dans lequel on veut les tester
 $paths = Array();
 $paths[] = CORE_DIR . 'libs/';
 $paths[] = CORE_DIR . 'controllers/';
 $paths[] = CORE_DIR . 'models/';
 
 /**
  * On teste si le fichier existe dans nos dossiers,
  * si le fichier existe, on l'inclut et on quitte la fonction
  * en renvoyant le booléen TRUE.
   */
 foreach ($paths as $path) {
 
  if (file_exists($path.$file_name)) {
 
   require $path.$file_name;
   return TRUE;
 
  }
 }
 
 /**
  * Si le fichier n'a pas été trouvé, on quitte la fonction
  * en renvoyant le booléen FALSE.
   */
 return FALSE;
}

Il suffit d’inclure cette fonction dans un fichier commun à nos scripts et elle sera exécutée automatiquement quand on tentera d’instancier une classe qui n’est pas déclarée.

5 Comments on "Charger automatiquement vos classes avec __autoload"

  1. Mitmi.fr from site de rencontre gratuit dit :

    Merci pour cette astuce, c’est très pratique.

  2. Fred from animation mariage dit :

    Merci pour cet article, j’ai bien compris grâce à vous le principe.

  3. dref from location vacances herault dit :

    c’est effectivement la meilleure solution, merci pour l’explication sur l’autoload.

  4. Sev from reseau social rencontre dit :

    Salut JB, tu vas faire un article sur la SPL autoload aussi ?

    • Lisa dit :

      J’approuve complètement la bonne pratique sur l’utilisation de chemins complets. Ceci mis à part c’est toujours intéressant de comprendre les différents comportements de PHP.

Got something to say? Go for it!

This site uses KeywordLuv. Enter YourName@YourKeywords in the Name field to take advantage.