Norme de chargement automatique PSR-4
Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy. Leçon 12 sur 91.
PSR-4 est une norme qui définit comment les classes PHP doivent être chargées automatiquement en fonction de leur espace de noms et de l’emplacement de leur fichier. Au lieu d’inclure manuellement chaque fichier de classe, PSR-4 permet à PHP de rechercher et de charger automatiquement les classes lorsque vous les utilisez.
La règle fondamentale est simple : l’espace de noms doit correspondre à la structure des répertoires. Si vous avez une classe App\Models\User, le fichier doit se trouver à App/Models/User.php.
<?php
// Fichier : src/Models/User.php
namespace App\Models;
class User {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
Vous pouvez écrire une fonction simple de chargement automatique qui respecte les règles PSR-4 :
<?php
// Fichier : autoload.php
spl_autoload_register(function ($class) {
$prefix = 'App\\';
$baseDir = __DIR__ . '/src/';
// Vérifier si la classe utilise notre préfixe de namespace
if (strpos($class, $prefix) === 0) {
$relativeClass = substr($class, strlen($prefix));
$file = $baseDir . str_replace('\\', '/', $relativeClass) . '.php';
if (file_exists($file)) {
require $file;
}
}
});
La fonction spl_autoload_register indique à PHP d’appeler votre fonction chaque fois qu’il rencontre une classe inconnue. La fonction convertit l’espace de noms en chemin de fichier et le charge.
Point clé : PSR-4 crée une correspondance prévisible entre les espaces de noms et les chemins de fichiers. Lorsque vous voyez App\Models\User, vous savez immédiatement que le fichier se trouve à src/Models/User.php. Cette convention rend les projets plus faciles à parcourir et à maintenir.
Défi
FacileConstruisons un système simple de chargement automatique PSR-4 qui charge automatiquement les classes en fonction de leur espace de noms et de l'emplacement de leur fichier.
Vous allez créer un projet avec trois fichiers qui montrent comment PSR-4 associe les espaces de noms aux chemins de répertoires :
src/Services/Logger.php: définissez une classeLoggerdans l'espace de nomsApp\Services. Elle doit avoir une propriétépublic $name, un constructeur qui accepte et définit le nom, ainsi qu'une méthodelog($message)qui renvoie"[name] logged: [message]".src/Services/Mailer.php: définissez une classeMailerdans l'espace de nomsApp\Services. Elle doit avoir une propriétépublic $sender, un constructeur qui accepte et définit l'expéditeur, ainsi qu'une méthodesend($to)qui renvoie"Mail from [sender] to [to]".main.php: créez un chargeur automatique PSR-4 à l'aide despl_autoload_registerqui associe le préfixe d'espace de nomsApp\au répertoiresrc/. Le chargeur automatique doit convertir les séparateurs d'espace de noms en séparateurs de répertoires et ajouter.phppour trouver le fichier correct. Après avoir enregistré le chargeur automatique, utilisez le mot-cléusepour importer les deux classes, puis créez unLoggeravec le nom"FileLogger"et unMaileravec l'expéditeur"admin@site.com". Affichez le résultat de l'appel àlog("System started")sur le logger et de l'appel àsend("user@example.com")sur le mailer (chacun sur sa propre ligne).
L'idée essentielle est que votre fonction de chargement automatique reçoit le nom complet de la classe (comme App\Services\Logger) et doit le convertir en chemin de fichier (src/Services/Logger.php). Utilisez strpos pour vérifier si la classe commence par votre préfixe d'espace de noms, substr pour obtenir le nom de classe relatif, et str_replace pour convertir les barres obliques inverses en barres obliques.
Essayez vous-même
<?php
// Implémentation de l'autoloader PSR-4
// TODO: Enregistrer un autoloader en utilisant spl_autoload_register
// L'autoloader devrait :
// 1. Vérifier si la classe commence par le préfixe de namespace 'App\'
// 2. Supprimer le préfixe 'App\' pour obtenir le nom de classe relatif
// 3. Convertir les séparateurs de namespace (\) en séparateurs de répertoire (/)
// 4. Préfixer avec 'src/' et ajouter '.php' pour construire le chemin du fichier
// 5. Inclure le fichier s'il existe
spl_autoload_register(function ($class) {
// TODO: Définir le préfixe de namespace et le répertoire de base
// TODO: Vérifier si la classe utilise le préfixe de namespace (utiliser strpos)
// TODO: Obtenir le nom de classe relatif (utiliser substr)
// TODO: Construire le chemin du fichier en remplaçant \ par / (utiliser str_replace)
// TODO: Requérir le fichier s'il existe
});
// TODO: Utiliser le mot-clé 'use' pour importer les classes Logger et Mailer
// TODO: Créer une instance de Logger avec le nom "FileLogger"
// TODO: Créer une instance de Mailer avec l'expéditeur "admin@site.com"
// TODO: Afficher le résultat de log("System started")
// TODO: Afficher le résultat de send("user@example.com")
?>Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses et objetsLe mot-clé $thisMéthodesPropriétésConstructeur (__construct)Destructeur (__destruct)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLe mot-clé parent::Redéfinition des méthodesLe mot-clé finalClasses abstraitesRécapitulatif – Hiérarchie des employés7Encapsulation
Public, Protected, PrivateModificateurs d’accès en profondeurAccesseurs et mutateursDissimulation de l’informationPromotion des constructeurs (8.0)Récapitulatif – Système de fiches étudiant10Concepts avancés de la POO
Composition ou héritageInjection de dépendancesClasses anonymesÉnumérations (PHP 8.1)Fibres (PHP 8.1)Approfondissement du clonage d’objetsGénérateurs et itérateurs13Patrons de conception – Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron CompositePatron Dépôt2Espaces de noms et chargement automatique
Introduction aux espaces de nomsLe mot-clé useNorme de chargement automatique PSR-4Autoloader de ComposerRécapitulatif - Projet organisé5Interfaces et contrats
Introduction aux interfacesImplémentation des interfacesImplémentation de plusieurs interfacesInterface ou classe abstraiteIndication de type avec les interfacesRécapitulatif - Calculateur de formes8Méthodes magiques
Introduction aux méthodes magiques__toString et __debugInfo__get, __set, __isset, __unset__call et __callStatic__clone et clonage d’objets__serialize et __unserializeRécapitulatif - Collection personnalisée3Propriétés de classe
Propriétés d’instance vs statiquesConstantes dans les classesMéthodes et propriétés statiquesPropriétés privées et protégéesPropriétés en lecture seule (PHP 8.1)Récapitulatif - Gestionnaire de comptes bancaires6Polymorphisme
Révision de la redéfinition des méthodesPolymorphisme via les interfacesAnnotations de type et types unionLiaison statique tardiveRécapitulatif - Processeur de paiements9Traits
Introduction aux traitsUtilisation de plusieurs traitsRésolution des conflits entre traitsMéthodes abstraites dans les traitsTraits par rapport à l’héritage12Patrons de conception – Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron StrategyEntraînez-vous par vous-même : Compilateur PHP en ligne