I. Pourquoi avons-nous besoin d'espaces de noms ?

Comme la taille de votre bibliothèque de code PHP augmente, il existe un risque accru de redéfinition accidentelle d'une fonction ou d'un nom de classe qui a été déclaré auparavant. Le problème est exacerbant lorsque vous tentez d'ajouter des composants tiers ou plugins. Que se passe-t-il si vous instaurez une classe Database ou User qui existe déjà ? Jusqu'à présent, la seule solution a été d'utiliser des noms de fonctions longs. Par exemple, WordPress préfixe chaque nom avec "wp_ ". Le Zend Framework utilise une convention de nommage très descriptif afin de donner des noms de classes longs comme la classe Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive.

Les problèmes de collision de noms peuvent être résolus avec les espaces de noms. Les constantes PHP, classes et fonctions peuvent être regroupées en bibliothèques d'espace de noms.

II. Comment définir les espaces de noms ?

Par défaut, toutes les constantes, les classes, et les noms de fonction sont placés dans l'espace global - comme elles l'étaient avant que PHP supporte les espaces de noms.

Le code des espaces de noms est défini en utilisant un mot-clé namespace unique en haut de votre fichier PHP. Ce doit être la première commande (à l'exception de declare) et pas de code non-PHP, HTML, ou d'espaces blancs ne peuvent précéder la commande, par exemple.

 
Sélectionnez
<?php  
// défini ce code dans l'espace de noms 'MonProjet'  
namespace MonProjet;  
// ... code ... 

Le code suivant sera affecté à l'espace de noms MonProjet. Il n'est pas possible de définir des nids d'espaces de noms ou plusieurs espaces de noms pour le même bloc de code (seul le dernier sera reconnu). Toutefois, vous pouvez définir un espace de noms de code différents dans le même fichier, par exemple :

 
Sélectionnez
<?php  
namespace MonProjet1;  
// code PHP pour l'espace de nom MonProjet1  
namespace MonProjet2;  
// code PHP pour l'espace de nom MonProjet2 
// Syntaxe alternative 
namespace MonProjet3 {  
// // code PHP pour l'espace de nom MonProjet3 
 } ?> 

Bien que cela soit possible, je le déconseille : conserver votre santé mentale en définissant un seul espace de noms par fichier.

II-1. Sous-espaces de noms

PHP vous permet de définir une hiérarchie d'espaces de noms afin de subdiviser vos bibliothèques. Les sous-espaces de noms sont séparés par une barre oblique inverse (\), par exemple :

  • MonProjet \ Nom
  • MonProjet \ Database \ MySQL
  • NomEntreprise \ MonProjet \ Bibliothèque \ FichiersCommuns \ widget1

III. Appeler du code des espaces de noms

Dans un fichier nommé lib1.php, nous allons définir une constante, une fonction et une classe au sein de l'espace de noms App \ LIB1 :

lib1.php
Sélectionnez
<?php  
// application library 1  
namespace App\Lib1;  
const MYCONST = 'App\Lib1\MYCONST';  
function MyFunction() {  
    return __FUNCTION__;  
}  
class MyClass {  
     static function WhoAmI() {  
         return __METHOD__; 
     }  
} ?> 

Nous pouvons maintenant inclure ce code dans un autre fichier PHP, par exemple :

myapp.php
Sélectionnez
<?php  
header('Content-type: text/plain');  
require_once('lib1.php');  
echo \App\Lib1\MYCONST . "\n";  
echo \App\Lib1\MyFunction() . "\n";  
echo \App\Lib1\MyClass::WhoAmI() . "\n";  
?> 

Aucun espace de noms n'est défini dans myapp.php afin que le code existe dans l'espace global. Toute référence directe à MYCONST, MyFunction ou MyClass va échouer parce qu'elles existent dans l'espace de noms App \ LIB1. Pour appeler du code dans lib1.php, on peut ajouter un préfixe \ App \ LIB1 pour définir des noms pleinement qualifiés. Le résultat suivant est émis quand on charge myapp.php :

 
Sélectionnez
App\Lib1\MYCONST  
App\Lib1\MyFunction  
App\Lib1\MyClass::WhoAmI 

Les noms pleinement qualifiés peuvent devenir assez longs et il y a peu d'avantages évidents par rapport à la définition des noms de classe longs tels que App-LIB1-MyClass. Par conséquent, dans le prochain article, nous allons discuter du cumul et jeter un oeil de plus près sur le fonctionnement de PHP quant à la résolution des noms d'espace de noms.

IV. Liens

Vous pouvez aussi aller voir mes autres traductions.

Merci à Baptiste Wicht et à Wachter pour leurs relectures orthographique.