Chargement automatique de classes avancé avec PHP 5 Concurrence d'autoloads

Sur un gros projet, vous allez parfois devoir manipuler plusieurs bibliothèques ou frameworks qui devront travailler en collaboration lors de l'exécution d'un script. Imaginez que chacune de ces bibliothèques possèdent leur propre implémentation de la fonction __autoload(). Ce cas de figure ne se présentera pas puisque PHP ne supporte pas la surcharge de fonctions, et le seul résultat qu'on pourra obtenir est une erreur fatale...

Grâce aux fonctions spl_autoload_*(), il est possible de manipuler plusieurs implémentations de chargement dynamique sans collisions. On utilise alors les méthodes spl_autoload_register() et éventuellement spl_autoload_unregister(). Ces fonctions permettent de gérer une file de fonctions exécutées les unes après les autres jusqu'à ce que le problème de dépendance soit résolu. Un petit exemple sera peut-être plus parlant :

   1.     <?php
  2.       
  3.     function fantastic_framework_autoload($classname)
  4.     {
  5.      file_exists('fantasticframework/classes/class.'.$classname.'.php') &&
  6.     require 'fantasticframework/classes/class.'.$classname.'.php';
  7.     }
  8.       
  9.     function helperslib_autoload($classname)
 10.     {
 11.      file_exists('helpers/class.'.$classname.'.php') &&
 12.      require 'helpers/class.'.$classname.'.php';
 13.     }
 14.       
 15.     function __autoload($classname)
 16.     {
 17.      static $_autoload = null;
 18.        if(is_null($_autoload))
 19.        require 'autoloading.php';
 20.       
 21.      require CLASSES_DIR.'/'.$_autoload;
 22.     }
 23.       
 24.     spl_autoload_register('fantastic_framework_autoload');
 25.     spl_autoload_register('helperslib_autoload');
 26.     spl_autoload_register('__autoload');

Ici, pour chaque dépendance non satisfaite, PHP exécutera chaque fonction une à une jusqu'à ce que le problème soit résolu. Permettant ainsi de définir plusieurs stratégies différentes en fonction du contexte. L'ordre d'exécution est celui définit par l'ordre d'enregistrement des fonctions : ici fantastic_framework_autoload, helperslib_autoload et enfin __autoload.


Le test de l'existence du fichier avant l'inclusion est obligatoire

Notez qu'il est nécessaire d'enregistrer manuellement __autoload(), spl_autoload_register remplace en effet le comportement par défaut de PHP. Il sera également nécessaire d'enregistrer manuellement la fonction spl_autoload() vue plus tôt si vous souhaitez l'utiliser.

Il est également important de noter qu'ici, il est nécessaire que les différentes fonctions utilisées ne puissent pas retourner d'erreur : le test de l'existence du fichier avant l'inclusion est obligatoire, sinon PHP affichera une erreur (causant l'arrêt du script avec require).