Chargement automatique de classes avancé avec PHP 5 Synchroniser le système de fichier et le nom des classes

Une méthode qui peut être explorée consiste à utiliser le nom de la classe à charger pour deviner l'emplacement du fichier dans notre organisation. Ce cas de figure est particulièrement intéressant quand l'organisation est découpée en modules.

Par exemple, mon programme contient, entre autres, les classes suivantes : MyAppRequest, MyAppContext, MyAppConfig, ViewTemplate, ViewCache, DbConnection, et pour finir, EmailEasing.


Comme le projet a été réfléchi en amont, et que ces noms correspondent à des conventions définies, tout ceci a un sens facilitant l'organisation du code :

 le préfixe MyApp correspond aux classes faisant partie du coeur de l'application,
  View correspond aux classes composant la partie vue (moteur de templates, etc.),
 Db aux outils permettant de manipuler la base de données,
 le suffixe Easing signifie que la classe correspond à une bibliothèque simplifiant certaines opérations.


Une implémentation efficace, fine et protégée contre la concurrence

On peut alors facilement répartir ces classes dans des fichiers bien organisés :

 sources/core, par exemple, MyAppRequest sera dans le fichier sources/core/class.Request.php,
 sources/view,
 sources/dblayer,
 sources/libs.

On peut alors proposer une implémentation efficace, fine et protégée contre la concurrence assez facilement :

 

  1.     <?php
  2.     define('SOURCES_DIR', 'myproject/sources');
  3.       
  4.     /**
  5.      * Autoload pour notre application.
  6.      * Attention, les noms de classes et de fichiers sont sensibles
  7.      * à la casse.
  8.      */
  9.     myapp_autoload($classname)
 10.     {
 11.     $path = SOURCES_DIR.'/';
 12.     $file = '';
 13.     if(substr($classname, 0, 5) == 'MyApp'))
 14.     {
 15.     $path .= 'core/';
 16.     $file = substr($classname, 5);
 17.     }
 18.     elseif(substr($classname, 0, 4) == 'View'))
 19.     {
 20.     $path .= 'view/';
 21.     $file = substr($classname, 4);
 22.     }
 23.     elseif(substr($classname, 0, 2) == 'Db'))
 24.     {
 25.     $path .= 'dblayer/';
 26.     $file = substr($classname, 2);
 27.     }
 28.     elseif(substr($classname, -6) == 'Easing'))
 29.     {
 30.     $path .= 'libs/';
 31.     $file = substr($classname, 0, -6);
 32.     }
 33.     }
 34.       
 35.     spl_autoload_register('myapp_autoload');
 36.     if(function_exists('__autoload'))
 37.     spl_autoload_register('__autoload');
 38.     spl_autoload_register('spl_autoload');