Kodokon kodokon.com

Namespaces, Autoloading und Composer

Strukturiere deinen Code mit PSR-4-Namespaces und lass Composer Klassen und Abhängigkeiten für dich laden.

8 Min. · 3 Fragen

Diese Lektion in Kodokon öffnen

Namespaces beseitigen Namenskollisionen: Zwei Bibliotheken können jeweils eine Klasse Client definieren, ohne dass es kracht. Die universelle Konvention: ein Vendor-Präfix (App, Acme\Blog), dann Sub-Namespaces, die den Ordnerbaum widerspiegeln. use importiert einen vollqualifizierten Namen in die aktuelle Datei, as benennt ihn bei Mehrdeutigkeit um. Eine Datei = eine Klasse = ein Namespace: Diese Disziplin ist keine stilistische Marotte, sie ist die eigentliche Voraussetzung für das Autoloading.

PHP
<?php

declare(strict_types=1);

namespace App\Service;

use App\Repository\UserRepository;
use Psr\Log\LoggerInterface as Logger;

final class UserService
{
    public function __construct(
        private UserRepository $users,
        private Logger $logger,
    ) {
    }
}
Eine Datei src/Service/UserService.php: Namespace, Importe, Alias.

Autoloading lädt die Klassendateien bei Bedarf: kein manuelles require mehr. Der Standard PSR-4 legt die Zuordnung fest: Ein Namespace-Präfix wird einem Wurzelordner zugeordnet, und jeder Sub-Namespace wird zu einem Unterordner. App\Service\UserService löst sich damit zu src/Service/UserService.php auf. Unter der Haube beruht alles auf spl_autoload_register - hier ist die minimale Implementierung, die zu verstehen sich lohnt, auch wenn du sie nie selbst neu schreibst:

PHP
<?php

declare(strict_types=1);

spl_autoload_register(function (string $class): void {
    $prefix = 'App\\';
    $baseDir = __DIR__ . '/src/';

    if (!str_starts_with($class, $prefix)) {
        return;
    }

    $relative = substr($class, strlen($prefix));
    $path = $baseDir
        . str_replace('\\', '/', $relative)
        . '.php';

    if (is_file($path)) {
        require $path;
    }
});

echo 'Autoloader registered';
Handgeschriebener PSR-4-Autoloader: Präfix, Wurzelordner, Umwandlung in einen Pfad.

Composer industrialisiert all das: composer.json deklariert deine Abhängigkeiten und deine PSR-4-Zuordnung - typischerweise "autoload": { "psr-4": { "App\\\\": "src/" } } - dann lädt composer install die Pakete nach vendor/ und erzeugt vendor/autoload.php, das einzige require deiner gesamten Anwendung. Wesentliche Unterscheidung: require für Pakete, die in Produktion gebraucht werden, require-dev für Werkzeuge (Tests, statische Analyse), die mit --no-dev aus Deployments ausgeschlossen werden.

BASH
composer init --name acme/app --no-interaction
composer require monolog/monolog
composer require --dev phpunit/phpunit
composer dump-autoload -o
Lebenszyklus: initialisieren, Abhängigkeiten hinzufügen, den Autoloader neu erzeugen.

Wissenscheck

Stelle sicher, dass du die wichtigsten Punkte dieser Lektion behalten hast.

  1. Wo liegt laut PSR-4 die Klasse App\Blog\PostRepository, wenn das Präfix App\ auf src/ zeigt?
    • src/App/Blog/PostRepository.php
    • src/Blog/PostRepository.php
    • src/blog/postrepository.php
  2. Welche Datei musst du einbinden, um vom Autoloading zu profitieren, das Composer erzeugt hat?
    • composer.json
    • vendor/autoload.php
    • eine autoload.php, die du im Wurzelverzeichnis anlegst
  3. Wofür ist composer require --dev da?
    • Ein Paket nur für die Entwicklung installieren, das mit --no-dev aus Deployments ausgeschlossen wird
    • Eine instabile Version des Pakets installieren
    • Das Paket global auf dem Rechner installieren