Kodokon kodokon.com

Namespaces, autoloading et Composer

Structurez votre code avec les namespaces PSR-4 et laissez Composer charger classes et dépendances à votre place.

8 min · 3 questions

Ouvrir cette leçon dans Kodokon

Les 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
<?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,
    ) {
    }
}
Un fichier src/Service/UserService.php : namespace, imports, alias.

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
<?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';
Autoloader PSR-4 artisanal : préfixe, dossier racine, conversion en chemin.

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.

BASH
composer init --name acme/app --no-interaction
composer require monolog/monolog
composer require --dev phpunit/phpunit
composer dump-autoload -o
Cycle de vie : initialiser, ajouter des dépendances, régénérer l'autoloader.

Quiz de validation

Vérifiez que vous avez bien retenu les points clés de cette leçon.

  1. Selon PSR-4, où se trouve la classe App\Blog\PostRepository si le préfixe App\ pointe vers src/ ?
    • src/App/Blog/PostRepository.php
    • src/Blog/PostRepository.php
    • src/blog/postrepository.php
  2. Quel fichier inclure pour bénéficier de l'autoloading généré par Composer ?
    • composer.json
    • vendor/autoload.php
    • un autoload.php à créer à la racine
  3. À quoi sert composer require --dev ?
    • Installer un paquet réservé au développement, exclu des déploiements avec --no-dev
    • Installer une version instable du paquet
    • Installer le paquet globalement sur la machine