Apprendre PHP & MySQL : Autoload
Automatisez le chargement des classes et améliorez la gestion de votre code avec l'autoload en PHP.
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()
.
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 :
- Récupérer dans le paramètre
$class
le nom de la classe. - 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.
// 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 :
- Récupérer dans le paramètre
$class
le nom complet de la classe (namespace + classe). Pour une classeUser
située dans le namespaceApp
, on aurait alors dans$class
la valeurApp\User
. - Construire le chemin vers le fichier contenant le code source de la classe. Pour cela on convertira les antislashs
\
en slashs/
avec la fonctionstr_replace()
.
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.
// 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é.