Easy-Micro

LANGAGE MVC PHP
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 :

MVC Namespaces

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 {
    // ...
}
Ce namespace est à rajouter en haut des trois fichiers du dossier model

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();

    // ...
}
Néanmoins, cela peut aussi porter à confusion si nous abusons de cette technique. Je vais donc éviter de faire appel à use mais au moins vous savez que ça existe au besoin.



Flux RSS Easy-Micro - Abonnez-vous Easy-Micro [ François Bisch ]