Namespaces und Autoloading erklärt
In einem Projekt mit fremden Bibliotheken gibt es zwangsläufig mehrere Klassen namens „Client" oder „Logger". Namespaces lösen das — und Autoloading sorgt dafür, dass niemand mehr Dateien von Hand einbindet.
Das lernen Sie
Ein Namespace ist ein Nachname für Klassen
Ohne Namespaces gäbe es jede Klasse nur einmal pro Anwendung. Da jedes Projekt heute fremde Bibliotheken nutzt, wäre das unhaltbar. Ein Namespace stellt dem Klassennamen einen Pfad voran.
// Datei: src/Auftrag/Position.php
declare(strict_types=1);
namespace Firma\Shop\Auftrag;
final class Position
{
// ...
}
// Der vollstaendige Name lautet jetzt:
// Firma\Shop\Auftrag\PositionEine zweite Klasse `Position` in einem anderen Namespace stört nicht, weil der vollständige Name ein anderer ist.
use kürzt Namen ab, es lädt nichts
declare(strict_types=1);
namespace Firma\Shop\Rechnung;
use Firma\Shop\Auftrag\Position;
use Firma\Lager\Position as Lagerposition;
final class Rechnungszeile
{
public function __construct(
private readonly Position $position,
private readonly ?Lagerposition $bestand = null,
) {
}
}Ein verbreitetes Missverständnis: `use` bindet keine Datei ein. Es legt nur fest, welcher vollständige Name gemeint ist, wenn im Code der kurze steht. Geladen wird die Datei erst beim ersten Zugriff — durch das Autoloading.
Autoloading: vom Namen zum Dateipfad
Früher stand am Anfang jeder Datei eine Reihe von `require`-Zeilen. Heute registriert man eine Funktion, die PHP aufruft, sobald eine unbekannte Klasse gebraucht wird. In der Praxis übernimmt das Composer nach der Übereinkunft PSR-4: Ein Namespace-Präfix wird auf ein Verzeichnis abgebildet, der Rest des Namens auf den Pfad darunter.
{
"autoload": {
"psr-4": {
"Firma\\Shop\\": "src/"
}
}
}Die Abbildung ist buchstäblich: Groß- und Kleinschreibung zählen, weil das Dateisystem auf dem Server sie unterscheidet — auch wenn der eigene Rechner das vielleicht nicht tut.
Ein Beispiel aus der Praxis
„Class not found" — „Class not found“ — vier typische Ursachen: Namespace und Pfad passen nicht zusammen; die Zuordnung ist neu und Composer kennt sie noch nicht; eine use-Anweisung fehlt oder eine globale Klasse wird im Namespace ohne führenden Backslash angesprochen; vendor/ wurde nicht installiert.
Eine dritte, seltenere Ursache ist der optimierte Autoloader: Mit `composer dump-autoload -o` entsteht eine feste Liste aller Klassen. Eine Klasse, deren Pfad nicht zur Regel passt, fehlt dort — und fällt erst in der Produktionsumgebung auf, weil dort optimiert wird und auf dem Entwicklungsrechner nicht.
Häufige Missverständnisse
Weiterführende Quellen
- PHP-Handbuch: Namespaces die Sprachseite
- PSR-4: Autoloader die Übereinkunft hinter der Abbildung
- Composer: Autoloading die Konfiguration im Detail
Über den Autor
Fabian Lücker ist geschäftsführender Gesellschafter der PHP-Schmiede KG in Rheine und seit 2007 in der Softwareentwicklung tätig. Er verantwortet Entwicklung und Konzeption und schreibt hier über Entscheidungen, die in echten Projekten anfallen.