Menu
Coddy logo textTech

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.

challenge icon

Défi

Facile

Construisons 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 classe Logger dans l'espace de noms App\Services. Elle doit avoir une propriété public $name, un constructeur qui accepte et définit le nom, ainsi qu'une méthode log($message) qui renvoie "[name] logged: [message]".
  • src/Services/Mailer.php : définissez une classe Mailer dans l'espace de noms App\Services. Elle doit avoir une propriété public $sender, un constructeur qui accepte et définit l'expéditeur, ainsi qu'une méthode send($to) qui renvoie "Mail from [sender] to [to]".
  • main.php : créez un chargeur automatique PSR-4 à l'aide de spl_autoload_register qui associe le préfixe d'espace de noms App\ au répertoire src/. Le chargeur automatique doit convertir les séparateurs d'espace de noms en séparateurs de répertoires et ajouter .php pour trouver le fichier correct. Après avoir enregistré le chargeur automatique, utilisez le mot-clé use pour importer les deux classes, puis créez un Logger avec le nom "FileLogger" et un Mailer avec 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")
?>
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Compilateur PHP en ligne