Namespaces
MVC en PHP : le rôle des namespaces
Le rôle des namespaces
Les espaces de nom (namespaces). Leur rôle ? Éviter les collisions de noms de classes.Imaginez. Vous travaillez sur un gros programme. Vous réutilisez plusieurs bibliothèques. Vous pouvez être sûrs qu'à un moment donné, il va bien y avoir quelqu'un qui a eu l'idée saugrenue de créer une classe CommentManager ou PostManager tout comme vous ! À ce moment-là, c'est le plantage garanti : on n'a pas le droit d'appeler deux classes par le même nom...
... sauf si on utilise les namespaces bien sûr ! Ils agissent un peu comme des dossiers. Ils vous permettent d'avoir 2 classes du même nom dans votre programme, du temps qu'elles sont dans des namespaces différents :
Utilisation des namespaces
Concrètement, les namespaces sont comme des dossiers. Dans la pratique, en général on commence par le nom de l'entreprise qui est responsable du projet, suivi du nom du projet. Vous pouvez mettre votre nom ou un pseudonyme si vous n'avez pas d'entreprise.Pour définir un namespace, rien de plus simple. On va déclarer un namespace juste avant la définition de la classe :
model/PostManager.php
<?php
namespace EasyMicro\projetBlog\Model; // La classe sera dans ce namespace
require_once("model/Manager.php");
class PostManager extends Manager {
// ...
}
Cela a un impact : tous les fichiers qui font appel à cette classe doivent maintenant ajouter le namespace en préfixe. Voilà par exemple à quoi va ressembler la fonction post() du contrôleur :
controller/frontend.php
<?php
require_once('model/PostManager.php');
require_once('model/CommentManager.php');
function post() {
$postManager = new \EasyMicro\projetBlog\Model\PostManager();
$commentManager = new \EasyMicro\projetBlog\Model\CommentManager();
// ...
}
Attention : en plaçant la classe Manager dans notre namespace, nous allons avoir un problème pour appeler PDO. En effet, PDO est une classe qui se trouve à la racine (dans le namespace global). Pour régler le problème, il faudra écrire \PDO dans le fichier model/Manager.php
Eviter la répétition du préfixe
Mais n'y a-t-il pas moyen d'éviter de répéter le namespace en préfixe à chaque fois ? Oui, c'est possible. Il faut utiliser le mot-clé use en début d'un fichier qui fait régulièrement appel à des classes d'un même namespace :controller/frontend.php :
<?php
use \EasyMicro\projetBlog\Model\PostManager;
use \EasyMicro\projetBlog\Model\CommentManager;
function post() {
$postManager = new PostManager();
$commentManager = new CommentManager();
// ...
}