Menu
Coddy logo textTech

Standard d'Autoloading PSR-4

Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy — leçon 12 sur 91.

PSR-4 est un standard 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 trouver et de charger les classes automatiquement lorsque vous les utilisez.

La règle de base est simple : l'espace de noms doit correspondre à la structure du répertoire. Si vous avez une classe App\Models\User, le fichier doit être situé à 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 d'autochargement simple qui suit les règles PSR-4 :

<?php
// Fichier : autoload.php
spl_autoload_register(function ($class) {
    $prefix = 'App\\';
    $baseDir = __DIR__ . '/src/';
    
    // Vérifie 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 un 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 dans src/Models/User.php. Cette convention rend les projets plus faciles à parcourir et à maintenir.

challenge icon

Défi

Facile

Construisons un système d'autoloading PSR-4 simple qui charge automatiquement les classes en fonction de leur espace de noms (namespace) et de l'emplacement de leur fichier.

Vous allez créer un projet avec trois fichiers qui démontrent comment PSR-4 mappe 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, et une méthode log($message) qui retourne "[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, et une méthode send($to) qui retourne "Mail from [sender] to [to]".
  • main.php — Créez un autoloader PSR-4 en utilisant spl_autoload_register qui mappe le préfixe d'espace de noms App\ au répertoire src/. L'autoloader doit convertir les séparateurs d'espace de noms en séparateurs de répertoire et ajouter .php pour trouver le fichier correct. Après avoir enregistré l'autoloader, 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 send("user@example.com") sur le mailer (chacun sur sa propre ligne).

L'idée clé est que votre fonction d'autoloader reçoit le nom complet de la classe (comme App\Services\Logger) et doit le convertir en un 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 (backslashes) en barres obliques (forward slashes).

Aide-mémoire

PSR-4 est un standard qui définit comment les classes PHP doivent être chargées automatiquement en fonction de leur espace de noms (namespace) et de l'emplacement de leur fichier. L'espace de noms doit correspondre à la structure du répertoire.

Exemple de structure de classe :

<?php
// Fichier : src/Models/User.php
namespace App\Models;

class User {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
}

Autoloader PSR-4 utilisant spl_autoload_register :

<?php
spl_autoload_register(function ($class) {
    $prefix = 'App\\';
    $baseDir = __DIR__ . '/src/';
    
    // Vérifier si la classe utilise notre préfixe d'espace de noms
    if (strpos($class, $prefix) === 0) {
        $relativeClass = substr($class, strlen($prefix));
        $file = $baseDir . str_replace('\\', '/', $relativeClass) . '.php';
        
        if (file_exists($file)) {
            require $file;
        }
    }
});

L'autoloader convertit les séparateurs d'espace de noms (\) en séparateurs de répertoire (/) et ajoute .php pour trouver le fichier correct. Par exemple, App\Models\User correspond à src/Models/User.php.

Essayez vous-même

<?php
// Implémentation de l'Autoloader PSR-4

// TODO: Enregistrer un autoloader en utilisant spl_autoload_register
// L'autoloader doit :
// 1. Vérifier si la classe commence par le préfixe d'espace de noms 'App\'
// 2. Supprimer le préfixe 'App\' pour obtenir le nom de classe relatif
// 3. Convertir les séparateurs d'espace de noms (\) en séparateurs de répertoire (/)
// 4. Ajouter 'src/' au début et '.php' à la fin pour construire le chemin du fichier
// 5. Inclure le fichier s'il existe

spl_autoload_register(function ($class) {
    // TODO: Définir le préfixe d'espace de noms et le répertoire de base
    
    // TODO: Vérifier si la classe utilise le préfixe d'espace de noms (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: Inclure 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