Skip to content

Autoload et Namespaces

Objectifs pédagogiques

  • Comprendre le rôle des namespaces.
  • Organiser le code de manière modulaire.
  • Mettre en place l’autoload des classes avec spl_autoload_register.

Pourquoi utiliser des namespaces ?

Les namespaces (espaces de noms) permettent :

  • d’éviter les conflits entre des classes ayant le même nom,
  • d’organiser le code par fonctionnalité ou domaine,
  • d’améliorer la lisibilité et la maintenabilité d’un projet.

Sans namespace, deux classes portant le même nom dans des fichiers différents provoqueraient une erreur.

php
<?php

namespace App\Models;

class Product {
    // ...
}

Utiliser un namespace

Le nom complet d'une classe avec un namespace s'appelle un FQCN (Fully Qualified Class Name).

php
<?php

namespace App\Services;

class EmailSender {
    public function send(string $to): void {
        echo "Email envoyé à $to";
    }
}

Utilisation avec use

php
<?php

require 'App/Services/EmailSender.php';

use App\Services\EmailSender;

$mailer = new EmailSender();
$mailer->send("user@example.com");

Organisation des fichiers

Il est courant de faire correspondre l’organisation des namespaces à la structure des dossiers.

/src
├── Models/
│   └── Product.php  → namespace App\Models;
├── Services/
│   └── EmailSender.php → namespace App\Services;

Autoloading avec spl_autoload_register

Plutôt que d’écrire un require à chaque fichier, on utilise une fonction d’autoloading :

php
<?php

spl_autoload_register(function ($class) {
    $prefix = "App\";
    $baseDir = __DIR__ . "/src/";

    $relativeClass = str_replace($prefix, "", $class);
    $file = $baseDir . str_replace("\", "/", $relativeClass) . ".php";

    if (file_exists($file)) {
        require $file;
    }
});

Exemple complet

php
<?php

namespace App\Models;

class Product {
    public function getName(): string {
        return "Ordinateur portable";
    }
}
php
<?php

use App\Models\Product;

require_once 'autoload.php';

$product = new Product();
echo $product->getName();

Autoloading avec Composer

Composer peut générer un autoload automatiquement :

composer.json

json
{
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    }
}
bash
composer dump-autoload

Ensuite :

php
require_once 'vendor/autoload.php';

use App\Models\Product;

Conclusion

Les namespaces et l'autoloading sont essentiels pour organiser des projets PHP de taille moyenne à grande. Ils facilitent l'intégration de bibliothèques tierces, la maintenance et la lisibilité du code.