In PHP-Projekten muss jede Klasse aus einer eigenen Datei geladen werden. Ohne Autoloading bedeutet das: Am Anfang jedes Skripts steht eine lange Liste von require-Aufrufen. Bei wachsenden Projekten wird das schnell unübersichtlich und fehleranfällig. Autoloading löst dieses Problem, indem PHP die benötigten Dateien automatisch lädt, sobald eine Klasse zum ersten Mal verwendet wird. In diesem Tutorial lernst du, wie spl_autoload_register() funktioniert, was der PSR-4-Standard vorschreibt und wie Composer das Autoloading automatisiert.

Ausgangspunkt ist die Frage, warum Autoloading überhaupt nötig ist. Von dort aus geht es über spl_autoload_register() und den PSR-4-Standard bis hin zur Einrichtung mit Composer.
Was ist Autoloading?
Autoloading ist ein Mechanismus, bei dem PHP automatisch die Datei einer Klasse einbindet, sobald diese zum ersten Mal benötigt wird. Statt manuell require oder include aufzurufen, registriert man eine Funktion, die den Klassennamen entgegennimmt und die passende Datei lädt. Das spart Code, verhindert vergessene Includes und verbessert die Wartbarkeit erheblich. In professionellen PHP-Projekten ist Autoloading der Standard und manuelle Dateieinbindung die Ausnahme.
Das Problem: Manuelle require-Aufrufe
Ohne Autoloading muss jede verwendete Klasse manuell eingebunden werden. Bei kleinen Skripten ist das kein Problem, bei größeren Projekten führt es jedoch zu langen Listen am Dateianfang und zu Fehlern, wenn ein require vergessen wird.
<?php
/* Ohne Autoloading: jede Klasse manuell einbinden */
require 'src/Models/User.php';
require 'src/Models/Produkt.php';
require 'src/Services/MailService.php';
require 'src/Controllers/UserController.php';
/* ... und so weiter */
Autoloading macht diese manuellen Aufrufe überflüssig.
spl_autoload_register() verwenden
Die Funktion spl_autoload_register() registriert eine Callback-Funktion, die PHP aufruft, wenn eine unbekannte Klasse verwendet wird. Die Callback-Funktion erhält den vollständigen Klassennamen (inklusive Namespace) als Parameter.
<?php
spl_autoload_register(function (string $klasse): void {
$datei = __DIR__ . '/src/' . str_replace('\\', '/', $klasse) . '.php';
if (file_exists($datei)) {
require $datei;
}
});
/* Ab jetzt werden Klassen automatisch geladen */
$user = new App\Models\User();
Der Autoloader wandelt den Klassennamen in einen Dateipfad um, indem er Backslashes durch Schrägstriche ersetzt und .php anhängt. Existiert die Datei, wird sie eingebunden. Die frühere Funktion __autoload() ist seit PHP 8.0 entfernt und sollte nicht mehr verwendet werden.
Autoloading mit Namespaces
Namespaces und Autoloading arbeiten eng zusammen. Der Namespace einer Klasse bestimmt, in welchem Verzeichnis die Datei gesucht wird. Dadurch entsteht eine klare Zuordnung zwischen Code-Struktur und Dateisystem.
Der PSR-4-Standard
PSR-4 ist ein von PHP-FIG definierter Standard, der die Zuordnung von Namespaces zu Verzeichnissen regelt. Er ist der aktuell empfohlene Standard für Autoloading und wird von Composer nativ unterstützt.
Regeln von PSR-4
Die Grundregel lautet: Jeder Teil des Namespaces nach dem Vendor-Prefix wird auf ein Verzeichnis abgebildet. Der Klassenname wird zum Dateinamen. Groß- und Kleinschreibung müssen exakt übereinstimmen.
Verzeichnisstruktur
/* Verzeichnisstruktur:
projekt/
├── src/
│ ├── Models/
│ │ └── User.php (namespace App\Models)
│ └── Services/
│ └── MailService.php (namespace App\Services)
├── vendor/
│ └── autoload.php
└── composer.json
*/
/* src/Models/User.php */
namespace App\Models;
class User
{
public function __construct(
public string $name
) {}
}
Der Namespace App\Models wird auf das Verzeichnis src/Models/ abgebildet. Die Klasse User liegt in der Datei User.php. Namespace und Verzeichnisstruktur spiegeln sich gegenseitig wider.
Autoloading mit Composer
Composer ist der Paketmanager für PHP und generiert automatisch einen PSR-4-konformen Autoloader. Die Konfiguration erfolgt in der composer.json.
composer.json konfigurieren
/* composer.json */
/* {
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
} */
Diese Konfiguration weist Composer an, den Namespace App auf das Verzeichnis src/ abzubilden.
Autoloader generieren
Nach der Konfiguration muss der Autoloader mit composer dump-autoload generiert werden. Danach reicht ein einziger require-Aufruf in der Einstiegsdatei:
<?php
require __DIR__ . '/vendor/autoload.php';
use App\Models\User;
use App\Services\MailService;
$user = new User('Max');
$mail = new MailService();
Alle Klassen, die der PSR-4-Konvention folgen, werden automatisch geladen. Manuelle require-Aufrufe sind nicht mehr nötig. Das vereinfacht die Projektstruktur erheblich und macht den Code übersichtlicher, da die Einstiegsdatei frei von langen Include-Listen bleibt.
Mehrere Autoloader registrieren
PHP erlaubt die Registrierung mehrerer Autoloader. Sie werden in der Reihenfolge ihrer Registrierung aufgerufen, bis einer die Klasse erfolgreich lädt. Das ist nützlich, wenn neben Composer ein eigener Autoloader für Legacy-Code benötigt wird.
Composer bietet zusätzlich die Möglichkeit, einen optimierten Autoloader zu generieren. Der Befehl composer dump-autoload --optimize erstellt eine Classmap, die alle Klassen und ihre Dateipfade vorab auflistet. Das beschleunigt das Autoloading in Produktionsumgebungen, da keine Dateisystem-Operationen mehr nötig sind, um die richtige Datei zu finden.
flowchart TD
A["new App\Models\User()"] --> B{"Klasse bereits geladen?"}
B -->|Ja| C["Objekt erstellen"]
B -->|Nein| D["spl_autoload_register aufrufen"]
D --> E["Namespace in Dateipfad umwandeln"]
E --> F["src/Models/User.php laden"]
F --> C
Typische Fehler und Stolperfallen
Beim Einrichten von Autoloading gibt es einige häufige Fehlerquellen:
- Groß- und Kleinschreibung bei Klassennamen und Dateinamen müssen übereinstimmen. Auf Linux-Systemen ist das Dateisystem case-sensitive, auf Windows nicht. Code, der auf Windows funktioniert, kann auf Linux fehlschlagen.
- Nach Änderungen an der Autoload-Konfiguration in
composer.json muss composer dump-autoload ausgeführt werden. Ohne diesen Schritt findet Composer die neuen Klassen nicht. - Namespace und Verzeichnisstruktur müssen exakt übereinstimmen. Eine Abweichung führt dazu, dass die Klasse nicht gefunden wird.
- Der führende Backslash bei globalem Namespace-Zugriff wird oft vergessen. Innerhalb eines Namespaces muss
\Exception statt Exception verwendet werden, um die globale Klasse zu referenzieren. __autoload() ist seit PHP 8.0 entfernt. Nur spl_autoload_register() ist der aktuelle Standard.
Fazit
Autoloading ist ein unverzichtbarer Bestandteil professioneller PHP-Entwicklung. Mit spl_autoload_register() lässt sich ein einfacher Autoloader bauen, der Klassennamen in Dateipfade umwandelt. Der PSR-4-Standard definiert klare Regeln für die Zuordnung von Namespaces zu Verzeichnissen. Composer automatisiert den gesamten Prozess und macht manuelle require-Aufrufe überflüssig. Für jedes PHP-Projekt, das mehr als eine Handvoll Klassen umfasst, ist Autoloading der empfohlene Weg. Wer Autoloading beherrscht, legt den Grundstein für skalierbare und gut wartbare PHP-Anwendungen.