L’auto chargement des classes en PHP

Il est considéré comme une bonne pratique en PHP orienté objet de créer un fichier par classe. Ceci a principalement pour but de conserver une meilleure clarté dans l’architecture générale d’un site et de simplifier la maintenabilité du code en séparant bien les différents éléments.

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>

 

Auto charger une classe en PHP avec la fonction spl_autoload_register

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 tente d'auto charger une classe qui n'existe pas en PHP

Une erreur est renvoyée si on tente d'auto charger une classe inaccessible en PHP

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.

Laisser un commentaire