Comment utiliser les espaces de noms en PHP partie 1 : les bases

| Craig Buckler (Auteur) | Joris Crozier (Traducteur) |

Cet article est la traduction de How to Use PHP Namespaces, Part 1: The Basics et va vous apprendre les bases de l'utilisation des espaces de noms en PHP.

Les espaces de noms sont l'un des changements les plus importants en PHP 5.3. Ils seront familiers aux développeurs C # et Java, et ils sont susceptibles de modifier la structure des applications PHP pour le mieux.

Commentez

- Titre : Comment utiliser les espaces de noms en PHP partie 1 : les bases

- Auteurs : Craig Buckler (Auteur), Joris Crozier (Traducteur)

- Parution : 22 décembre 2009

- Licence : Copyright ® 2009 Joris CROZIER. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

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

- II. Comment définir les espaces de noms ?

- II-1. Sous-espaces de noms

- III. Appeler du code des espaces de noms

- IV. Liens

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.

<?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 :

<?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

<?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

<?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 :

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.