Apprendre PHP & MySQL : Autoload

Automatisez le chargement des classes et améliorez la gestion de votre code avec l'autoload en PHP.

Icône de calendrier
Intermédiaire
12 chapitres

Problématique : des inclusions nombreuses

La POO est un paradigme de programmation incontournable dans la plupart des projets web.

Si travailler avec des classes en PHP confère une approche structurelle très appréciable lors du développement, elle présente un inconvénient logique : celui d’être verbeuse.

Ainsi, chaque classe utilisée, étant factorisée dans un fichier dédié, demande à préalablement être incluse avec la fonction require().

Et vous n’êtes pas sans penser qu’inclure manuellement l’ensemble des classes utilisées est une lourde tâche..!

require('ClassA.php');
require('ClassB.php');
require('ClassC.php');

Bonne nouvelle… il existe une solution pour y remédier : l’autoloading !

Solution : l’autoloading

Pour mettre en place un autoload automatique des classes en PHP, vous pouvez utiliser la fonction native spl_autoload_register() ou le gestionnaire de dépendances Composer.

Autoload natif

Développer un système d’autoload natif est chose aisée car PHP nous mâche le travail avec sa fonction spl_autoload_register().

autoload.php
copié !
spl_autoload_register(function (string $class): void {
	require($class . '.php');
});

La fonction spl_autoload_register() sera déclenchée dès qu’une classe sera utilisée dans le code.

Au cours de son exécution, elle va :

  1. Récupérer dans le paramètre $class le nom de la classe.
  2. Construire le nom du fichier contenant le code source de la classe.

Une fois notre autoload créé, nous n’avons plus qu’à l’inclure dans le fichier principal de notre application.

index.php
copié !
// spl_autoload_register() va automatiquement inclure "User.php"
require('autoload.php');

$user1 = new User(1, "Toto"); 
Cas particulier : classe située dans un namespace

Dans le cas où la classe PHP utilisée est déclarée dans un namespace, au cours de son exécution, elle va :

  1. Récupérer dans le paramètre $class le nom complet de la classe (namespace + classe). Pour une classe User située dans le namespace App, on aurait alors dans $class la valeur App\User.
  2. Construire le chemin vers le fichier contenant le code source de la classe. Pour cela on convertira les antislashs \ en slashs / avec la fonction str_replace().
autoload.php
copié !
spl_autoload_register(function (string $class): void {
	require(str_replace('\\', '/', $class) . '.php');
});

Imaginons que la classe User soit située dans le namespace App\Membership.

En adaptant le namespace au chemin physique de la classe, notre autoloading peut aller chercher des fichiers dans des dossiers variés.

index.php
copié !
// spl_autoload_register() va automatiquement inclure "App/Membership/User.php"
require('autoload.php');

use App\Membership;
$user1 = new User(1, "Toto"); 

Autoload avec Composer

Composer est le gestionnaire de dépendances (ou « Dependency Manager ») incontournable dans l’écosystème PHP.

Outre la résolution des dépendances et le téléchargement des paquets nécessaires à un projet, Composer permet, via son fichier de configuration 📄 composer.json, d’automatiser l’autoloading pour que vous puissiez facilement utiliser les classes des dépendances dans votre projet.

Je ne rentre pas dans les détails de cette approche dans cette formation, mais je vous invite à l’explorer davantage en l’appliquant à vos projets PHP pour améliorer leur maintenabilité et leur évolutivité.