Structurez votre code avec les namespaces PSR-4 et laissez Composer charger classes et dépendances à votre place.
Ouvrir cette leçon dans KodokonLes namespaces éliminent les collisions de noms : deux bibliothèques peuvent chacune définir une classe Client sans conflit. La convention universelle : un préfixe éditeur (App, Acme\Blog), puis des sous-espaces qui reflètent l'arborescence des dossiers. use importe un nom complet dans le fichier courant, as le renomme en cas d'ambiguïté. Un fichier = une classe = un namespace : cette discipline n'est pas une coquetterie, c'est la condition de l'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,
) {
}
}L'autoloading charge les fichiers de classes à la demande : plus aucun require manuel. Le standard PSR-4 définit la correspondance : un préfixe de namespace est associé à un dossier racine, et chaque sous-namespace devient un sous-dossier. App\Service\UserService se résout ainsi en src/Service/UserService.php. Sous le capot, tout repose sur spl_autoload_register - voici l'implémentation minimale, utile à comprendre même si vous ne la réécrirez jamais :
<?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 industrialise tout cela : composer.json déclare vos dépendances et votre mapping PSR-4 - typiquement "autoload": { "psr-4": { "App\\\\": "src/" } } - puis composer install télécharge les paquets dans vendor/ et génère vendor/autoload.php, l'unique require de toute votre application. Distinction essentielle : require pour les paquets nécessaires en production, require-dev pour l'outillage (tests, analyse statique), exclu des déploiements avec --no-dev.
composer init --name acme/app --no-interaction
composer require monolog/monolog
composer require --dev phpunit/phpunit
composer dump-autoload -oApp\Blog\PostRepository si le préfixe App\ pointe vers src/ ?composer require --dev ?