L’un des inconvénients de cette façon de procéder, cependant, est qu’on va possiblement avoir à écrire de longues séries d’inclusion de classes (une inclusion par classe) dans nos scripts lorsque ceux-ci ont besoin de plusieurs classes.
Pour éviter de rallonger le code inutilement et de nous faire perdre du temps, nous avons un moyen en PHP de charger (c’est-à-dire d’inclure) automatiquement nos classes d’un seul coup dans un fichier.
Pour cela, nous allons pouvoir utiliser la fonction spl_autoload_register()
. Cette fonction nous permet d’enregistrer une ou plusieurs fonctions qui vont être mises dans une file d’attente et que le PHP va appeler automatiquement dès qu’on va essayer d’instancier une classe.
L’idée ici va donc être de passer une fonction qui permet de n’inclure que les classes dont on a besoin dans un script et de la passer à spl_autoload_register()
afin qu’elle soit appelée dès que cela est nécessaire.
On va pouvoir ici soit utiliser une fonction nommée, soit idéalement créer une fonction anonyme :
<!DOCTYPE html> <html> <head> <title>Cours PHP & MySQL</title> <meta charset="utf-8"> <link rel="stylesheet" href="cours.css"> </head> <body> <h1>Titre principal</h1> <?php spl_autoload_register(function($classe){ require 'classes/' .$classe. '.class.php'; }); $pierre = new Admin('Pierre', 'abcdef', 'Sud'); $mathilde = new Admin('Math', 123456, 'Nord'); $florian = new Abonne('Flo', 'flotri', 'Est'); $pierre->getNom(); echo '<br>'; $mathilde->getNom(); echo '<br>'; $florian->getNom(); ?> <p>Un paragraphe</p> </body> </html>
Dans ce script, on tente d’instancier nos classes Admin
et Abonne
créées précédemment. Pour rappel, ces deux classes étendent la classe parent Utilisateur
.
On utilise ici la fonction spl_autoload_register()
en lui passant une fonction anonyme en argument donc le rôle est d’inclure des fichiers de classe.
En résultat, la fonction spl_autoload_register()
sera appelée dès qu’on va instancier une classe et va tenter d’inclure la classe demandée en exécutant la fonction anonyme. Notez que cette fonction va également tenter de charger les éventuelles classes parents en commençant par les parents.
Ici, la fonction spl_autoload_register()
va donc tenter d’inclure les fichiers utilisateur.class.php
, admin.class.php
et abonne.class.php
situés dans un dossier « classes ».
Vous comprenez ici j’espère tout l’intérêt de placer tous nos fichiers de classes dans un même dossier et de respecter une norme d’écriture lorsqu’on nomme nos fichiers de classe puisque cela nous permet de pouvoir écrire des instructions formatées comme le require
de notre fonction spl_autoload_register()
.
Tenter d’auto-charger une classe inaccessible
Notez que si vous tentez d’inclure une classe qui est introuvable ou inaccessible le PHP renverra une erreur fatale.
On va pouvoir prendre en charge les erreurs et les exceptions en particulier en utilisant la classe Exception
. La prise en charge des erreurs et des exceptions est cependant un sujet relativement complexe qui justifie une partie de cours en soi. Nous verrons comment cela fonctionne en détail dans la prochaine partie.