Menu
Coddy logo textTech

PSR-4 Autoloading-Standard

Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy — Lektion 12 von 91.

PSR-4 ist ein Standard, der definiert, wie PHP-Klassen basierend auf ihrem Namespace und ihrem Speicherort automatisch geladen werden sollten. Anstatt jede Klassendatei manuell einzubinden, ermöglicht PSR-4 es PHP, Klassen automatisch zu finden und zu laden, wenn Sie diese verwenden.

Die Grundregel ist einfach: Der Namespace muss mit der Verzeichnisstruktur übereinstimmen. Wenn Sie eine Klasse App\Models\User haben, sollte sich die Datei unter App/Models/User.php befinden.

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

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

Sie können eine einfache Autoloader-Funktion schreiben, die den PSR-4-Regeln folgt:

<?php
// Datei: autoload.php
spl_autoload_register(function ($class) {
    $prefix = 'App\\';
    $baseDir = __DIR__ . '/src/';
    
    // Prüfen, ob die Klasse unser Namespace-Präfix verwendet
    if (strpos($class, $prefix) === 0) {
        $relativeClass = substr($class, thickness($prefix));
        $file = $baseDir . str_replace('\\', '/', $relativeClass) . '.php';
        
        if (file_exists($file)) {
            require $file;
        }
    }
});

Die Funktion spl_autoload_register weist PHP an, Ihre Funktion aufzurufen, wann immer es auf eine unbekannte Klasse stößt. Die Funktion wandelt den Namespace in einen Dateipfad um und lädt diesen.

Kernpunkt: PSR-4 erstellt ein vorhersehbares Mapping zwischen Namespaces und Dateipfaden. Wenn Sie App\Models\User sehen, wissen Sie sofort, dass sich die Datei unter src/Models/User.php befindet. Diese Konvention macht Projekte einfacher zu navigieren und zu warten.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein einfaches PSR-4-Autoloading-System erstellen, das Klassen automatisch basierend auf ihrem Namespace und Dateispeicherort lädt.

Sie werden ein Projekt mit drei Dateien erstellen, die demonstrieren, wie PSR-4 Namespaces auf Verzeichnispfade abbildet:

  • src/Services/Logger.php — Definieren Sie eine Logger-Klasse im Namespace App\Services. Sie sollte eine public $name-Eigenschaft haben, einen Konstruktor, der den Namen akzeptiert und setzt, und eine log($message)-Methode, die "[name] logged: [message]" zurückgibt.
  • src/Services/Mailer.php — Definieren Sie eine Mailer-Klasse im Namespace App\Services. Sie sollte eine public $sender-Eigenschaft haben, einen Konstruktor, der den Absender akzeptiert und setzt, und eine send($to)-Methode, die "Mail from [sender] to [to]" zurückgibt.
  • main.php — Erstellen Sie einen PSR-4-Autoloader mit spl_autoload_register, der das Namespace-Präfix App\ auf das Verzeichnis src/ abbildet. Der Autoloader sollte Namespace-Separatoren in Verzeichnis-Separatoren umwandeln und .php anhängen, um die richtige Datei zu finden. Verwenden Sie nach der Registrierung des Autoloaders das Schlüsselwort use, um beide Klassen zu importieren, und erstellen Sie dann einen Logger mit dem Namen "FileLogger" und einen Mailer mit dem Absender "admin@site.com". Geben Sie das Ergebnis des Aufrufs von log("System started") auf dem Logger und send("user@example.com") auf dem Mailer aus (jeweils in einer eigenen Zeile).

Die entscheidende Erkenntnis ist, dass Ihre Autoloader-Funktion den vollqualifizierten Klassennamen (wie App\Services\Logger) erhält und diesen in einen Dateipfad (src/Services/Logger.php) umwandeln muss. Verwenden Sie strpos, um zu prüfen, ob die Klasse mit Ihrem Namespace-Präfix beginnt, substr, um den relativen Klassennamen zu erhalten, und str_replace, um Backslashes in Forward Slashes umzuwandeln.

Spickzettel

PSR-4 ist ein Standard, der definiert, wie PHP-Klassen basierend auf ihrem Namespace und ihrem Speicherort automatisch geladen werden sollen. Der Namespace muss mit der Verzeichnisstruktur übereinstimmen.

Beispiel für eine Klassenstruktur:

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

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

PSR-4 Autoloader unter Verwendung von spl_autoload_register:

<?php
spl_autoload_register(function ($class) {
    $prefix = 'App\\';
    $baseDir = __DIR__ . '/src/';
    
    // Check if class uses our namespace prefix
    if (strpos($class, $prefix) === 0) {
        $relativeClass = substr($class, strlen($prefix));
        $file = $baseDir . str_replace('\\', '/', $relativeClass) . '.php';
        
        if (file_exists($file)) {
            require $file;
        }
    }
});

Der Autoloader konvertiert Namespace-Separatoren (\) in Verzeichnis-Separatoren (/) und hängt .php an, um die korrekte Datei zu finden. Zum Beispiel wird App\Models\User zu src/Models/User.php aufgelöst.

Probier es selbst

<?php
// PSR-4 Autoloader Implementierung

// TODO: Registrieren Sie einen Autoloader mit spl_autoload_register
// Der Autoloader sollte:
// 1. Prüfen, ob die Klasse mit dem Namespace-Präfix 'App\' beginnt
// 2. Das 'App\'-Präfix entfernen, um den relativen Klassennamen zu erhalten
// 3. Namespace-Separatoren (\) in Verzeichnis-Separatoren (/) umwandeln
// 4. 'src/' voranstellen und '.php' anhängen, um den Dateipfad zu erstellen
// 5. Die Datei einbinden (require), falls sie existiert

spl_autoload_register(function ($class) {
    // TODO: Definieren Sie das Namespace-Präfix und das Basisverzeichnis
    
    // TODO: Prüfen Sie, ob die Klasse das Namespace-Präfix verwendet (nutzen Sie strpos)
    
    // TODO: Ermitteln Sie den relativen Klassennamen (nutzen Sie substr)
    
    // TODO: Erstellen Sie den Dateipfad, indem Sie \ durch / ersetzen (nutzen Sie str_replace)
    
    // TODO: Binden Sie die Datei ein, falls sie existiert
});

// TODO: Verwenden Sie das 'use'-Schlüsselwort, um die Klassen Logger und Mailer zu importieren

// TODO: Erstellen Sie eine Logger-Instanz mit dem Namen "FileLogger"

// TODO: Erstellen Sie eine Mailer-Instanz mit dem Absender "admin@site.com"

// TODO: Geben Sie das Ergebnis von log("System started") aus

// TODO: Geben Sie das Ergebnis von send("user@example.com") aus
?>
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung