Dans cette leçon, l'instructeur explique pourquoi il est mauvais de définir des classes PHP dans le même fichier que le code qui les utilise, surtout dans les projets de grande taille. Il montre comment extraire chaque classe dans son propre fichier en suivant la convention NomDeClasse.class.php et l’inclure avec `include`. Ensuite, il décrit les limites de cette approche (liste d’inclusions fastidieuse, risque d’oubli) et introduit le chargement automatique (autoload). Il crée d’abord une fonction de chargeur personnalisée qui, à partir du nom de la classe, construit le nom du fichier et l’inclut, puis il montre comment appeler cette fonction manuellement. Enfin, il présente la fonction native `splautoloadregister` qui enregistre le chargeur dans la pile d’autoload, permettant à PHP de charger automatiquement la classe dès qu’elle est sollicitée (instanciation, héritage, appel statique). Il précise que le chargeur doit respecter la convention de nommage du fichier, montre le comportement lorsqu’un fichier de classe est absent (erreur), et indique que le même mécanisme fonctionne aussi pour les interfaces. La leçon se conclut sur les bonnes pratiques pour les gros projets.
Chapters
Bonjour à tous et bienvenue dans cette nouvelle leçon de programmation orientée objet en PHP. Aujourd'hui, nous allons voir le chargement automatique de classes. Lors de la vidéo hors-série consacrée au développement d'un compteur de visites en orienté objet, nous avons pu réaliser ce code. Au sein de la même page qui s'appelle Counter.php, nous avons créé la définition de la classe nommée Counter et juste en dessous nous avons instancié celle-ci pour l'exploiter ensuite. Bien qu'il s'agit en fait d'un petit code, il est mal organisé parce que nous avons défini la classe dans la même page où on devrait l'exploiter, alors que dans un grand projet on a souvent besoin de solliciter plusieurs classes dont le nombre peut dépasser des dizaines. Alors si on suit cette pratique, on se retrouvera avec des pages qui sont bourrées de code de définition de classes, sans parler bien sûr de la redondance puisqu'on sera obligé de définir ces codes dans chacune des pages. Alors la solution, c'est les inclusions. Nous allons donc prendre le code de la définition de la classe et on va le mettre dans une page à part. Et ensuite on va inclure celle-ci dans le document où on en aura vraiment besoin. Première opération alors, c'est de retirer ce code et l'inclure dans une page à part. Voilà pour la définition de la classe. Nous allons créer par exemple une autre page qui porte le même nom que la classe pour que ça soit mieux organisé. On va mettre le tag de PHP. Et ensuite on mettra le code de la classe. Donc maintenant on va enregistrer dans le même dossier avec le même nom que la classe, ça veut dire Counter. Et on va pas mettre Counter.php mais on va mettre Counter.class.php. Comme ça on fera la différence entre les pages ordinaires et les pages qui contiennent les définitions de classes. Puis on enregistre. Et maintenant il suffit d'inclure cette page dans le document courant. On mettra donc include Counter.class.php. Bon, si on exécute déjà pour voir le résultat, on voit que ça marche bien, c'est bien un compteur de visites uniques qui s'incrémente. Bien que le code paraît mieux organisé, mais imaginez que nous utilisons des dizaines de classes. Alors on va probablement définir une liste d'inclusions au début de chaque page. Et qui dit une liste d'inclusion dit un grand risque d'oubli, sans parler de la forme du code qui deviendra aussitôt moche. Donc la solution c'est le chargement automatique de la classe. On va procéder de cette manière: au lieu d'inclure directement la définition de la classe, on va plutôt faire appel à une fonction qui va faire ce travail à notre place. On mettra donc ici function et on appellera la fonction chargeur. Ça veut dire c'est le chargeur automatique de la classe. Et cette fonction accepte un paramètre qu'on appellera par exemple cl pour dire classe. Et on va remplacer le nom de la classe ici par l'argument qu'on concatène avec .class.php. Maintenant ce qu'on va faire c'est juste appeler la fonction chargeur en lui passant comme argument le nom de la classe. Ça veut dire compteur. Exécutons maintenant. Ça marche toujours bien. Cependant, c'est pas trop pratique aussi comme méthode parce qu'on sera obligé d'appeler la fonction chargeur autant de fois que nous avons de classes. Mais au lieu de faire ça, on va plutôt faire appel à une fonction spéciale qui s'appelle spl autodownload comme ceci. Et comme argument on va lui passer le nom de la fonction chargeur en tant que chaîne de caractères. En fait, la fonction spl_autoload de Logiston permet d'enregistrer la fonction qui permet de charger automatiquement la classe dans la pile autoload. La pile autoload est en fait une liste de fonctions que l'on a définies manuellement, mais chacune de ces fonctions a pour rôle d'inclure une classe à la demande. Autrement dit, au moment de la compilation du code, si on sollicite les services d'une classe via une opération comme l'instanciation, l'héritage ou appel statique, Dans ce cas, le PHP va exécuter les fonctions de la pile autoload une à une en leur passant comme argument le nom de la classe sollicitée, jusqu'à ce que le fichier qui contient la définition de la classe soit inclus. Autrement dit, il nous suffit de déclarer cette seule ligne pour que le chargement automatique soit assuré en PHP. Et bien entendu, il faut respecter la chose suivante: la fonction chargeur doit toujours inclure un fichier qui porte le nom de la classe, dans ce cas Counter.class.php, dans notre cas bien entendu, mais sinon vous êtes libre de renommer vos classes comme vous souhaitez. Alors exécutons maintenant pour voir le résultat. On va encore effacer l'historique. Et voilà, ça marche bien, c'est-à-dire que la définition de la classe est chargée automatiquement. Maintenant imaginez que je veux instancier une autre classe, bien sûr une classe que je n'ai pas encore définie. Par exemple, Ob= new Ma classe comme ceci. Regardez ce qui va se passer automatiquement. Le PHP a généré une erreur. Il me dit que le fichier qui s'appelle ma-classe.class.php n'existe pas, ou bien il n'a pas pu le trouver dans l'emplacement spécifié. Alors vous avez remarqué comment le compilateur a deviné automatiquement le nom du fichier qui contient la classe. C'est exactement la forme spécifiée. Donc, pour les grands projets où vous aurez l'occasion de manipuler plusieurs classes, il est préférable de procéder au chargement automatique via la fonction spl_autoload du logiciel Stern. Notez que cette fonction ne permet pas de charger automatiquement que les définitions de la classe mais aussi les définitions des interfaces que l'on va traiter dans une leçon à part. Ça sera tout pour cette séance, merci pour votre attention et à la vidéo prochaine.