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-autoloadEnsuite :
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.