Les namespace en PHP

par

dans

Le concept

Un espace de nom permet de regrouper plusieurs éléments faisant ayant un sens dans leur ensemble.

On peut voir cela comme un dossier regroupant plusieurs fichiers abordant le même thème. Un fichier de même pourrait alors exister dans deux dossiers différents, mais pas dans le même, et pour accéder à l’un ou l’autre des deux fichiers ayant le même nom on utilisera l’arborescence complète en partant du dossier.

Exemple : Le fichier /dossier1/info.txt est différent du fichier /dossier2/info.txt. On peut accéder aux deux fichiers. Chacun peut contenir des informations totalement différentes. Mais chacun fais sens dans le dossier où il se situe.

Ce concept s’applique aux espaces de nom afin de résoudre un grand problème en programmation. Le problème est qu’une application peut intégrer diverses bibliothèques ayant chacun ses classes et fonctions. On risque alors d’avoir des conflits entre le nom des classes, fonctions, constantes … En plus de régler ce problème, les espaces de noms vont permettre de faire des alias (raccourcis) vers des noms parfois long de classes.

Un espace de nom permet donc de regrouper des classes (dont les classes abstraites et les traits), interfaces, fonctions, constantes, etc. en un ensemble sous le mot-clé namespace.

Pour continuer sur l’exemple des dossiers, chaque dossier peut contenir un ou plusieurs sous dossiers. Il en est de même avec les espaces de noms. Un espaces de nom peut en contenir plusieurs. Enfin, si ce n’est pas recommandé pour la lisibilité du code, il reste néanmoins possible de définir plusieurs espaces de nom dans un même fichier.

Déclaration d’un namespace

L’espace de nom doit être déclaré dès le début du fichier, avec le mot-clé namespace. Aucun autre code, ni même espace, ne doit être présent avant cette déclaration. Un espace de nom devant regrouper plusieurs classes pourra donc être indiqué au début de plusieurs fichiers, chaque fichier représentant généralement une classe.

Espace de nom
<?php
namespace NomProjet;
Espace de nom avec sous espaces
<?php
namespace NomProjet\EspaceA\EspaceAB;
Plusieurs espaces de nom dans le même fichier (on utilise les accolades)
<?php
namespace NomProjet {
 
    class User
    {
    }
}
 
namespace AutreProjet {
 
    class User
    {
    }
}
Utilisation d’un alias

Si nous avons plusieurs sous espaces de noms et que cela devient trop illisible, il est possible de définir un alias pour raccourcir le code à écrire.

// 1er fichier contenant un namespace
 
namespace NomProjet\EspaceA\EspaceAB\EspaceABC; // Déclaration du namespace
 
// Code du namespace
// ...
 
 
// Autre fichier utilisant ce namespace
 
require 'ns.ABC.php'; // Inclusion du fichier source du namespace
 
use NomProjet\EspaceA\EspaceAB\EspaceABC as nsABC; // Définition d'un alias
 
nsABC\getClientName(); // Se transforme côté PHP en NomProjet\EspaceA\EspaceAB\EspaceABC\getClientName().

Utilisation d’un namespace

La constante magique __NAMESPACE__

La constante magique __NAMESPACE__ permet retourne une chaine de caractère qui est le nom de l’espace de nom courant. Elle peut notamment permettre d’accéder dynamiquement à un objet ou une constante d’un objet.

$classname = 'Client';
$client_class = __NAMESPACE__ . '\\' . $classname;
$client_objet = new $client_class();