PHP Autoloading ohne Composer

Composer ist für viele Projekte sinnvoll aber nicht für jedes. Wer ein schlankes PHP-Projekt ohne externe Abhängigkeiten baut braucht keinen Composer nur um Klassen automatisch zu laden.

spl_autoload_register

PHP ruft diese Funktion auf wenn eine Klasse benötigt wird die noch nicht geladen ist.

spl_autoload_register(function (string $class): void {
    $file = __DIR__ . '/src/' . str_replace('\\', '/', $class) . '.php';
    if (file_exists($file)) {
        require $file;
    }
});

Aus dem Klassenname App\Core\Database wird der Pfad src/App/Core/Database.php.

Mehrere Verzeichnisse

spl_autoload_register(function (string $class): void {
    $dirs = [
        __DIR__ . '/core/',
        __DIR__ . '/modules/',
    ];

    $file = str_replace('\\', '/', $class) . '.php';

    foreach ($dirs as $dir) {
        $path = $dir . $file;
        if (file_exists($path)) {
            require $path;
            return;
        }
    }
});

Namespaces und Verzeichnisstruktur

Der einfachste Ansatz ist die Verzeichnisstruktur direkt an die Namespace-Struktur anzupassen.

src/
├── Core/
│   ├── Database.php     → namespace Core;  class Database
│   └── Router.php       → namespace Core;  class Router
├── Modules/
│   └── UserModule.php   → namespace Modules; class UserModule

Einmalig in der index.php einbinden

require_once __DIR__ . '/autoload.php';

$db = new Core\Database();

Kein Composer, kein vendor-Verzeichnis, kein Autoload-Dump. Für eigene Projekte ohne externe Pakete völlig ausreichend.