PSR-4-Autoloading-Standard
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 12 von 91.
PSR-4 ist ein Standard, der festlegt, wie PHP-Klassen basierend auf ihrem Namespace und ihrem Dateispeicherort automatisch geladen werden sollen. Anstatt jede Klassendatei manuell einzubinden, ermöglicht PSR-4 PHP, Klassen automatisch zu finden und zu laden, wenn du sie verwendest.
Die grundlegende Regel ist einfach: Der Namespace muss der Verzeichnisstruktur entsprechen. Wenn du eine Klasse App\Models\User hast, 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;
}
}
Du kannst 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, strlen($prefix));
$file = $baseDir . str_replace('\\', '/', $relativeClass) . '.php';
if (file_exists($file)) {
require $file;
}
}
});
Die Funktion spl_autoload_register weist PHP an, deine Funktion aufzurufen, sobald es auf eine unbekannte Klasse stößt. Die Funktion wandelt den Namespace in einen Dateipfad um und lädt ihn.
Wichtiger Punkt: PSR-4 erstellt eine vorhersehbare Zuordnung zwischen Namensräumen und Dateipfaden. Wenn du App\Models\User siehst, weißt du sofort, dass sich die Datei unter src/Models/User.php befindet. Diese Konvention erleichtert das Navigieren und Warten von Projekten.
Aufgabe
EinfachErstellen wir ein einfaches PSR-4-Autoloading-System, das Klassen automatisch anhand ihres Namespace und ihres Dateipfads lädt.
Du erstellst ein Projekt mit drei Dateien, die zeigen, wie PSR-4 Namespaces auf Verzeichnispfade abbildet:
src/Services/Logger.php: Definiere eineLogger-Klasse im NamespaceApp\Services. Sie sollte einepublic $name-Eigenschaft, einen Konstruktor, der den Namen entgegennimmt und setzt, sowie einelog($message)-Methode haben, die"[name] logged: [message]"zurückgibt.src/Services/Mailer.php: Definiere eineMailer-Klasse im NamespaceApp\Services. Sie sollte einepublic $sender-Eigenschaft, einen Konstruktor, der den Absender entgegennimmt und setzt, sowie einesend($to)-Methode haben, die"Mail from [sender] to [to]"zurückgibt.main.php: Erstelle mitspl_autoload_registereinen PSR-4-Autoloader, der das Namespace-PräfixApp\dem Verzeichnissrc/zuordnet. Der Autoloader sollte Namespace-Trennzeichen in Verzeichnistrennzeichen umwandeln und.phpanhängen, um die richtige Datei zu finden. Verwende nach der Registrierung des Autoloaders das Schlüsselwortuse, um beide Klassen zu importieren, und erstelle anschließend einenLoggermit dem Namen"FileLogger"sowie einenMailermit dem Absender"admin@site.com". Gib das Ergebnis des Aufrufs vonlog("System started")für den Logger und vonsend("user@example.com")für den Mailer aus (jeweils in einer eigenen Zeile).
Die zentrale Erkenntnis ist, dass deine Autoloader-Funktion den vollständig qualifizierten Klassennamen (wie App\Services\Logger) erhält und ihn in einen Dateipfad (src/Services/Logger.php) umwandeln muss. Verwende strpos, um zu prüfen, ob die Klasse mit deinem Namespace-Präfix beginnt, substr, um den relativen Klassennamen zu ermitteln, und str_replace, um Backslashes in Schrägstriche umzuwandeln.
Probier es selbst
<?php
// PSR-4 Autoloader-Implementierung
// TODO: Registriere einen Autoloader mit spl_autoload_register
// Der Autoloader sollte:
// 1. Prüfe, ob die Klasse mit dem Namespace-Präfix 'App\' beginnt
// 2. Entferne das 'App\'-Präfix, um den relativen Klassennamen zu erhalten
// 3. Konvertiere Namespace-Trennzeichen (\) in Verzeichnis-Trennzeichen (/)
// 4. Stelle 'src/' voran und hänge '.php' an, um den Dateipfad zu erstellen
// 5. Binde die Datei ein, falls sie existiert
spl_autoload_register(function ($class) {
// TODO: Definiere das Namespace-Präfix und das Basisverzeichnis
// TODO: Prüfe, ob die Klasse das Namespace-Präfix verwendet (verwende strpos)
// TODO: Hole den relativen Klassennamen (verwende substr)
// TODO: Erstelle den Dateipfad, indem \ durch / ersetzt wird (verwende str_replace)
// TODO: Die Datei einbinden, falls sie existiert
});
// TODO: Verwende das 'use'-Schlüsselwort, um die Klassen Logger und Mailer zu importieren
// TODO: Erstelle eine Logger-Instanz mit dem Namen "FileLogger"
// TODO: Erstelle eine Mailer-Instanz mit dem Absender "admin@site.com"
// TODO: Gib das Ergebnis von log("System started") aus
// TODO: Gib das Ergebnis von send("user@example.com") aus
?>Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in OOPKlassen vs. ObjekteDas Schlüsselwort $thisMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick – Einfacher Taschenrechner4Vererbung
Grundlegende VererbungDas Schlüsselwort parent::MethodenüberschreibungDas Schlüsselwort finalAbstrakte KlassenRückblick – Mitarbeiterhierarchie7Kapselung
Öffentlich, geschützt, privatZugriffsmodifikatoren im DetailGetter und SetterInformationsverbergungKonstruktor-Promotion (8.0)Wiederholung – System zur Verwaltung von Schülerdatensätzen2Namespaces & Autoloading
Einführung in NamespacesDas use-SchlüsselwortPSR-4-Autoloading-StandardComposer-AutoloaderRückblick – Organisiertes Projekt5Schnittstellen & Verträge
Einführung in SchnittstellenSchnittstellen implementierenMehrere Schnittstellen implementierenSchnittstelle vs. abstrakte KlasseTyp-Hinweise mit SchnittstellenRückblick – Formrechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objektklonen__serialize & __unserializeRückblick – Benutzerdefinierte Sammlung11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenBenutzerdefinierte Exception-HierarchieTry, Catch, FinallyRückblick – Formularvalidator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klassen-Eigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenSchreibgeschützte Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphie
Methodenüberschreibung erneut betrachtetPolymorphie über SchnittstellenTyp-Hinweise & Union-TypenSpätes statisches BindenRückblick – Zahlungsabwickler9Traits
Einführung in TraitsMehrere Traits verwendenAuflösung von Trait-KonfliktenAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungÜbe selbstständig: Online-PHP-Compiler