Strukturiere deinen Code mit PSR-4-Namespaces und lass Composer Klassen und Abhängigkeiten für dich laden.
Diese Lektion in Kodokon öffnenNamespaces 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
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,
) {
}
}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
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';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.
composer init --name acme/app --no-interaction
composer require monolog/monolog
composer require --dev phpunit/phpunit
composer dump-autoload -oApp\Blog\PostRepository, wenn das Präfix App\ auf src/ zeigt?composer require --dev da?