Composer Autoloader
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy — Lektion 13 von 91.
Das Schreiben eines eigenen Autoloaders funktioniert, aber echte PHP-Projekte verwenden Composer, um das Autoloading automatisch zu handhaben. Composer liest die Konfiguration Ihres Projekts und generiert einen optimierten Autoloader, der den PSR-4-Standards entspricht.
Die Konfiguration befindet sich in einer composer.json-Datei im Stammverzeichnis Ihres Projekts. So definieren Sie die Autoloading-Regeln:
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}Dies teilt Composer mit, dass jede Klasse, die mit App\ beginnt, aus dem Verzeichnis src/ geladen werden soll. Nachdem dies eingerichtet wurde, generiert Composer die Autoloader-Dateien in einem Verzeichnis vendor/.
Um den Autoloader von Composer zu verwenden, benötigen Sie nur eine Zeile am Anfang Ihrer Einstiegsdatei:
<?php
require 'vendor/autoload.php';
use App\Models\User;
use App\Services\Logger;
$user = new User("Alice");
$logger = new Logger();
Diese einzige require-Anweisung übernimmt das gesamte Laden von Klassen für Ihr gesamtes Projekt. Sie können bei Bedarf mehrere Namespace-Mappings definieren:
{
"autoload": {
"psr-4": {
"App\\": "src/",
"Tests\\": "tests/"
}
}
}Wichtiger Punkt: Der Autoloader von Composer macht manuelle Datei-Includes überflüssig und gewährleistet ein konsistentes Laden von Klassen in Ihrem gesamten Projekt. Es ist der Standardansatz, der von praktisch allen modernen PHP-Anwendungen und Frameworks verwendet wird.
Aufgabe
EinfachLassen Sie uns eine kleine Anwendung erstellen, die den Autoloading-Ansatz von Composer nutzt, um Klassen über mehrere Dateien hinweg zu organisieren. Sie werden simulieren, wie ein echtes PHP-Projekt seinen Code mit PSR-4-Namespaces und einem zentralen Autoloader strukturiert.
Sie werden vier Dateien erstellen, die zusammenarbeiten:
src/Models/Product.php— Definieren Sie eineProduct-Klasse im NamespaceApp\Models. Sie sollte die Eigenschaftenpublic $nameundpublic $pricehaben, einen Konstruktor, der beide Werte akzeptiert und setzt, sowie eine MethodegetInfo(), die"[name]: $[price]"zurückgibt.src/Models/Customer.php— Definieren Sie eineCustomer-Klasse im NamespaceApp\Models. Sie sollte eine Eigenschaftpublic $namehaben, einen Konstruktor, der den Namen akzeptiert und setzt, sowie eine Methodegreet(), die"Welcome, [name]!"zurückgibt.vendor/autoload.php— Erstellen Sie einen einfachen Autoloader mitspl_autoload_register, der das Verhalten von Composer nachahmt. Er sollte das Namespace-PräfixApp\auf das Verzeichnissrc/abbilden, Namespace-Separatoren in Verzeichnis-Separatoren umwandeln und.phpanhängen, um die korrekte Datei zu laden.index.php— Dies ist Ihre Einstiegsdatei. Binden Sie den Autoloader ausvendor/autoload.phpmit einer einzigen Zeile ein und verwenden Sie dann das Schlüsselwortuse, um sowohlApp\Models\Productals auchApp\Models\Customerzu importieren. Erstellen Sie einProductmit dem Namen"Laptop"und dem Preis999sowie einenCustomermit dem Namen"Alice". Geben Sie das Ergebnis des Aufrufs vongreet()für den Kunden undgetInfo()für das Produkt aus (jeweils in einer eigenen Zeile).
Das Schlüsselkonzept hierbei ist, dass Ihre index.php nur eine einzige require-Anweisung benötigt, um den Autoloader zu laden — danach werden alle Klassen automatisch geladen, wenn Sie sie verwenden. Genau so arbeiten moderne PHP-Frameworks und Anwendungen mit Composer.
Spickzettel
Composer automatisiert das Laden von Klassen, indem es eine composer.json Konfigurationsdatei liest und einen optimierten Autoloader generiert, der den PSR-4-Standards folgt.
Definieren Sie Autoloading-Regeln in der composer.json:
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}Dies ordnet den App\ Namespace dem src/ Verzeichnis zu. Composer generiert Autoloader-Dateien in einem vendor/ Verzeichnis.
Verwenden Sie den Autoloader von Composer mit einer einzigen require-Anweisung:
<?php
require 'vendor/autoload.php';
use App\Models\User;
use App\Services\Logger;
$user = new User("Alice");
$logger = new Logger();
Definieren Sie bei Bedarf mehrere Namespace-Mappings:
{
"autoload": {
"psr-4": {
"App\\": "src/",
"Tests\\": "tests/"
}
}
}Der Autoloader von Composer macht manuelle Datei-Includes überflüssig und ist der Standardansatz in modernen PHP-Anwendungen.
Probier es selbst
<?php
// TODO: Binde den Autoloader aus vendor/autoload.php ein
// TODO: Verwende das 'use' Schlüsselwort, um App\Models\Product zu importieren
// TODO: Verwende das 'use' Schlüsselwort, um App\Models\Customer zu importieren
// TODO: Erstelle ein Product mit dem Namen "Laptop" und dem Preis 999
// TODO: Erstelle einen Customer mit dem Namen "Alice"
// TODO: Gib das Ergebnis von greet() des Kunden aus
// TODO: Gib das Ergebnis von getInfo() des Produkts 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