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.
Aufgabe
EinfachLassen 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 eineLogger-Klasse im NamespaceApp\Services. Sie sollte einepublic $name-Eigenschaft haben, einen Konstruktor, der den Namen akzeptiert und setzt, und einelog($message)-Methode, die"[name] logged: [message]"zurückgibt.src/Services/Mailer.php— Definieren Sie eineMailer-Klasse im NamespaceApp\Services. Sie sollte einepublic $sender-Eigenschaft haben, einen Konstruktor, der den Absender akzeptiert und setzt, und einesend($to)-Methode, die"Mail from [sender] to [to]"zurückgibt.main.php— Erstellen Sie einen PSR-4-Autoloader mitspl_autoload_register, der das Namespace-PräfixApp\auf das Verzeichnissrc/abbildet. Der Autoloader sollte Namespace-Separatoren in Verzeichnis-Separatoren umwandeln und.phpanhängen, um die richtige Datei zu finden. Verwenden Sie nach der Registrierung des Autoloaders das Schlüsselwortuse, um beide Klassen zu importieren, und erstellen Sie dann einenLoggermit dem Namen"FileLogger"und einenMailermit dem Absender"admin@site.com". Geben Sie das Ergebnis des Aufrufs vonlog("System started")auf dem Logger undsend("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
?>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 die OOPKlassen vs. ObjekteDas $this-SchlüsselwortMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick - Einfacher Taschenrechner4Vererbung
Grundlagen der VererbungDas parent:: SchlüsselwortMethoden überschreibenDas final SchlüsselwortAbstrakte KlassenZusammenfassung – Mitarbeiter-Hierarchie7Kapselung
Public, Protected, PrivateZugriffsmodifikatoren im DetailGetter und SetterInformation HidingConstructor Promotion (8.0)Zusammenfassung – Studentenverwaltungssystem2Namensräume & Autoloading
Einführung in NamensräumeDas use-SchlüsselwortPSR-4 Autoloading-StandardComposer AutoloaderZusammenfassung – Organisiertes Projekt5Interfaces & Verträge
Einführung in InterfacesInterfaces implementierenMehrfache Interface-ImplementierungInterface vs. Abstrakte KlasseType Hinting mit InterfacesZusammenfassung – Formen-Rechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objekt-Klonen__serialize & __unserializeZusammenfassung - Eigene Collection11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenEigene Exception-HierarchieTry, Catch, FinallyZusammenfassung - Formular-Validator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klasseneigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenReadonly-Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphismus
Method Overriding erneut betrachtetPolymorphismus über InterfacesType Hinting & Union TypesLate Static BindingZusammenfassung – Payment Processor9Traits
Einführung in TraitsVerwendung mehrerer TraitsKonfliktlösung bei TraitsAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung