L3 Info : PHP et Applications Web
 
◃  Ch. 8 Extra ball !  ▹
 

Autochargement des classes

  • En PHP, les débuts de fichiers tournent parfois à l'accumulation de require...
  • C'est aussi fastidieux que source d'oublis ou d'erreurs
  • Via la SPL (encore elle !), PHP offre un système efficace pour charger automatiquement les classes nécessaires à nos programmes : la fonction spl_autoload_register()
  • spl_autoload_register() enregistre une fonction pour implémenter __autoload()
  • Signature :
    spl_autoload_register ( callable $autoload_function = ? , bool $throw = true , bool $prepend = false ) : bool
  • Exemple de fonction __autoload :
    function monChargeurDeClasse_V1(string $className) {
        include './'.$className.'.php';
    }
    spl_autoload_register('monChargeurDeClasse_V1'); 
  • Exemple similaire avec une fonction anonyme :
    spl_autoload_register(function (string $className) {
                            include './'.$className.'.php';
                            }
                        ); 
  • Traitement des namespaces : exemple avec la classe coursPHP\ClassExemplePHP
    • Si le namespace correspond à un dossier il faut remplacer le backslash (\) par un slash (/) et toujours rajouter l'extension :
      spl_autoload_register(function (string $className) {
                              // il faut échapper le backslash d'où le '\\'
                              $className = str_replace('\\','/',$className);
                              include './'.$className.'.php';
                              }
                          ); 
    • Si l'autochargement se fait depuis un namespace, il faut l'enlever du chemin relatif :
      spl_autoload_register(function (string $className) {
                              $className = str_replace(__NAMESPACE__.'\\','',$className);
                              $className = str_replace('\\','/',$className);
                              include './'.$className.'.php';
                              }
                          ); 
  • Quoi qu'il arrive : toujours adapter à son architecture (dossier class, dossiers correspondants aux namespaces, ...) et ses conventions de nommage (.php, .class.php, ...)