Aujourd'hui, nous apprenons à organiser notre code PHP avec les namespaces et à charger automatiquement nos classes avec l'autoloading, en suivant le standard PSR-4.
1. Pourquoi les Namespaces ?
Le problème : Conflits de noms
<?php
class Database {
public function connect() {
return "Connexion MySQL";
}
}
class Database {
public function connect() {
return "Connexion PostgreSQL";
}
}
?>
Problème : Impossible d'avoir deux classes avec le même nom dans le même projet !
Solution : Les Namespaces
<?php
namespace MonApp;
class Database {
public function connect() {
return "Connexion MySQL";
}
}
namespace Librairie;
class Database {
public function connect() {
return "Connexion PostgreSQL";
}
}
?>
2. Déclarer et utiliser des Namespaces
Syntaxe de base
<?php
namespace Models;
class Utilisateur {
private $nom;
public function __construct($nom) {
$this->nom = $nom;
}
public function getNom() {
return $this->nom;
}
}
?>
Utiliser une classe avec namespace
<?php
require 'src/Models/Utilisateur.php';
$user1 = new \Models\Utilisateur("Jean");
use Models\Utilisateur;
$user2 = new Utilisateur("Marie");
use Models\Utilisateur as User;
$user3 = new User("Paul");
echo $user1->getNom() . "<br>";
echo $user2->getNom() . "<br>";
echo $user3->getNom();
?>
Résultat :
Jean
Marie
Paul
3. Organisation du code avec Namespaces
Structure recommandée
projet/
│
├── src/
│ ├── Controllers/
│ │ ├── HomeController.php
│ │ └── UserController.php
│ │
│ ├── Models/
│ │ ├── User.php
│ │ └── Article.php
│ │
│ ├── Views/
│ │ └── home.php
│ │
│ └── Database/
│ ├── Connection.php
│ └── QueryBuilder.php
│
├── public/
│ └── index.php
│
└── vendor/
Exemple complet avec sous-namespaces
<?php
namespace Models;
class User {
public $nom;
}
namespace Controllers;
use Models\User;
class UserController {
public function index() {
$user = new User();
$user->nom = "Jean Dupont";
return $user;
}
}
use Controllers\UserController;
$controller = new UserController();
$user = $controller->index();
echo $user->nom;
?>
4. Autoloading avec spl_autoload_register()
Le problème des require multiples
<?php
require 'src/Models/User.php';
require 'src/Models/Article.php';
require 'src/Models/Comment.php';
require 'src/Controllers/HomeController.php';
require 'src/Controllers/UserController.php';
?>
Solution : Autoloader automatique
<?php
spl_autoload_register(function ($class) {
$class = str_replace('\\', '/', $class);
$file = __DIR__ . '/src/' . $class . '.php';
if (file_exists($file)) {
require $file;
}
});
use Models\User;
use Controllers\UserController;
$user = new User();
$controller = new UserController();
?>
5. PSR-4 : Standard d'autoloading
Qu'est-ce que PSR-4 ?
PSR-4 (PHP Standards Recommendation 4) est un standard qui définit comment organiser vos classes et namespaces.
Règle simple : Le namespace doit correspondre à la structure des dossiers.
| Namespace |
Chemin du fichier |
| Models\User |
src/Models/User.php |
| Controllers\UserController |
src/Controllers/UserController.php |
| Database\MySQL\Connection |
src/Database/MySQL/Connection.php |
Autoloader conforme PSR-4
<?php
spl_autoload_register(function ($class) {
$prefix = '';
$baseDir = __DIR__ . '/src/';
$relativeClass = $class;
$file = $baseDir . str_replace('\\', '/', $relativeClass) . '.php';
if (file_exists($file)) {
require $file;
}
});
?>
6. Introduction à Composer
Qu'est-ce que Composer ?
Gestionnaire de dépendances : Composer installe et gère les bibliothèques PHP de votre projet, comme npm pour Node.js.
Autoloader intégré : Composer génère automatiquement un autoloader PSR-4 pour vous ! Plus besoin d'écrire votre propre autoloader.
Fichier composer.json
{
"name": "monprojet/monapp",
"description": "Mon application PHP",
"autoload": {
"psr-4": {
"": "src/"
}
},
"require": {
"php": ">=7.4"
}
}
Utiliser l'autoloader de Composer
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use Models\User;
use Controllers\UserController;
$user = new User();
$controller = new UserController();
?>
Commandes Composer essentielles :
composer install : Installer les dépendances
composer require vendor/package : Ajouter une bibliothèque
composer dump-autoload : Régénérer l'autoloader
composer update : Mettre à jour les dépendances
7. Exemple complet
Structure du projet
monprojet/
│
├── src/
│ ├── Models/
│ │ └── User.php
│ ├── Controllers/
│ │ └── UserController.php
│ └── Database/
│ └── Connection.php
│
├── public/
│ └── index.php
│
├── autoload.php
└── composer.json
Code complet
<?php
spl_autoload_register(function ($class) {
$file = __DIR__ . '/src/' . str_replace('\\', '/', $class) . '.php';
if (file_exists($file)) {
require_once $file;
}
});
require_once __DIR__ . '/../autoload.php';
use Controllers\UserController;
use Database\Connection;
$controller = new UserController();
$user = $controller->show(1);
echo "Utilisateur : " . htmlspecialchars($user->getNom()) . "<br>";
$db = new Connection();
echo $db->connect();
?>
Résultat :
Utilisateur : Jean Dupont
Connexion établie
Froggiesplaining :
Objectifs de ce cours :
✅ Comprendre le problème des conflits de noms de classes
✅ Déclarer et utiliser des namespaces
✅ Organiser le code selon le standard PSR-4
✅ Créer un autoloader avec spl_autoload_register()
✅ Utiliser Composer pour l'autoloading automatique
Points clés à retenir :
• Namespaces = Quartiers de la mare (MareNord\Froggie vs MareSud\Froggie)
• use = Raccourci pour importer une classe sans écrire le chemin complet
• Autoloading = Majordome magique qui charge les classes automatiquement
• PSR-4 = Standard qui fait correspondre namespace et structure de dossiers
• spl_autoload_register() = Fonction PHP pour créer un autoloader custom
• Composer = Super majordome qui gère tout (classes + bibliothèques tierces)
• Un seul require 'vendor/autoload.php' et tout est chargé automatiquement
• Organisation: namespace Models; dans src/Models/User.php
Exercice pratique :
1. Créer la structure: src/Models/, src/Controllers/, src/Views/
2. Créer Models\User.php avec namespace Models;
3. Créer Controllers\UserController.php avec namespace Controllers;
4. Créer un autoload.php avec spl_autoload_register()
5. Dans index.php, require l'autoload puis use Models\User;
6. Instancier un User sans require manuel du fichier
7. Bonus: Installer Composer et configurer composer.json avec PSR-4
8. Conseil de Froggie: Utilise Composer dès que possible ! C'est comme avoir un GPS dans la mare, tu ne te perds jamais.