Zum Inhalt springen

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.

  • Für wenEntwickler, technisch Interessierte
  • NiveauMittel
  • Lesezeitetwa 6 Minuten
  • Stand16. Oktober 2026

Das lernen Sie

  • Was ein Namespace ist und wie er geschrieben wird
  • Was use-Anweisungen bewirken — und was nicht
  • Wie Autoloading einen Klassennamen in einen Dateipfad übersetzt
  • Die zwei häufigsten Ursachen für „Class not found"

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.

PHPgeprüft mit PHP 8.3
// Datei: src/Auftrag/Position.php
declare(strict_types=1);

namespace Firma\Shop\Auftrag;

final class Position
{
    // ...
}

// Der vollstaendige Name lautet jetzt:
// Firma\Shop\Auftrag\Position
Der Namespace steht ganz oben, nach declare. Er hat nichts mit dem Dateinamen zu tun — die Verbindung stellt erst das Autoloading her.

Eine 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

PHPgeprüft mit PHP 8.3
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,
    ) {
    }
}
Zwei Klassen mit demselben kurzen Namen lassen sich über „as" nebeneinander verwenden.

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.

JSONcomposer.json, Auszug
{
    "autoload": {
        "psr-4": {
            "Firma\\Shop\\": "src/"
        }
    }
}
Firma\Shop\Auftrag\Position wird damit zu src/Auftrag/Position.php. Nach einer Änderung hier ist composer dump-autoload nötig.

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.

  • Der Namespace in der Datei passt nicht zum Pfad. `namespace Firma\Shop\Auftrag;` in `src/auftrag/Position.php` funktioniert auf dem eigenen Rechner und scheitert auf dem Server.
  • Die Zuordnung ist neu und Composer weiß noch nichts davon. Nach jeder Änderung an `autoload` in der `composer.json` muss `composer dump-autoload` laufen.

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

Nein, es kürzt nur den Namen ab. Das Laden macht der Autoloader beim ersten Zugriff.

Die Sprache verlangt das nicht. Die Übereinkunft PSR-4 und damit Composer verlangen es — und daran hält sich praktisch jedes Projekt.

Nur beim ersten Zugriff auf eine Klasse, und der optimierte Autoloader macht daraus einen Nachschlagevorgang in einer fertigen Liste.

Weiterführende Quellen

Ü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.