Comment utiliser les espaces de noms en PHP Partie 2 : importation, alias et résolution de nom

Cet article est la traduction de How to Use PHP Namespaces, Part 2: Importing, Aliases, and Name Resolution.

Dans la partie 1, nous avons examiné l'utilité des espaces de noms en PHP et le mot-clé namespace. Dans cet article, nous examinons la commande use et la façon dont PHP résout les noms d'espace de noms.

Commentez Donner une note à l'article (0)

Article lu   fois.

Les deux auteurs

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

Introduction

A titre d'exemple, nous allons définir deux blocs de code presque identique, la seule différence est leur espace de noms :

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__; 
    } 
} 
?> 
lib2.php
Sélectionnez
<?php 
// application library 2 
namespace App\Lib2; 

const MYCONST = 'App\Lib2\MYCONST'; 
function MyFunction() { 
    return __FUNCTION__; 
} 

class MyClass { 
    static function WhoAmI() { 
        return __METHOD__; 
    } 
} 
?> 

Il y a un peu de terminologie PHP à comprendre avant de commencer...

Nom pleinement qualifié

Tout code PHP peut se référer à un nom pleinement qualifié - un identifiant commençant l'espace de noms et par le séparateur de barre oblique inverse - par exemple \App\LIB1\MYCONST, \App\LIB2\MyFunction(), etc.

Les noms pleinement qualifiés n'ont pas d'ambiguïté. La première barre oblique inverse fonctionne de manière semblable à un chemin de fichier, il signifie l'espace global du «root». Si nous avons implémenté une fonction MyFunction() différente dans notre espace global, elle pourrait être appelée à partir de lib1.php ou lib2.php en utilisant \MyFunction().

Les noms pleinement qualifiés sont utiles pour des appels uniques de fonctions ou d'initialisation objet. Toutefois, ils peuvent devenir impraticables lorsque vous faites beaucoup d'appels. Comme nous allons le découvrir, PHP offre d'autres options pour nous sauver des crampes de frappe des espaces de nommage.

Nom qualifié

Un identifiant avec au moins un séparateur d'espace de noms, par exemple LIB1\MyFunction().

Nom non qualifié

Un identifiant, sans séparateur d'espace de noms, par exemple MyFunction().

II. Travail au sein du même espace de noms

Considérons le code suivant :

myapp1.php
Sélectionnez
<?php 
namespace App\Lib1; 

require_once('lib1.php'); 
require_once('lib2.php'); 
 
header('Content-type: text/plain'); 
echo MYCONST . "\n"; 
echo MyFunction() . "\n"; 
echo MyClass::WhoAmI() . "\n"; 
?> 

Même si l'on inclut à la fois lib1.php et lib2.php, les identificateurs MYCONST, MyFunction, et MyClass référencent seulement le code dans lib1.php. Cela se produit parce que le code myapp1.php est dans le même espace de noms \LIB1 :

Résultat :

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

III. Importation d'espace de noms

Les espaces de noms peuvent être importés grâce à l'opérateur use, par exemple :

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

Vous pouvez définir autant de use que voulu ou vous pouvez séparer les espaces de noms par une virgule.
Dans cet exemple, nous avons importé l'espace de noms App\LIB2. Nous ne pouvons toujours pas faire référence directement à MYCONST, MyFunction ou MyClass parce que notre code se trouve dans l'espace global, et PHP va les chercher là-bas. Toutefois, si l'on ajoute un préfixe de LIB2\, ils deviennent des noms qualifiés.
PHP va chercher dans les espaces de noms importés jusqu'à ce qu'il trouve une correspondance.

Résultat :

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

IV. Les alias d'espace de noms

Les alias d'espace de noms sont peut-être les implémentations les plus utiles. Les alias nous permettent de référencer les espaces de noms en utilisant un nom plus court.

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

La première déclaration de use définit App\LIB1 comme « L ». Les noms qualifiés utilisant des «L » seront traduits par App\LIB1 au moment de la compilation. On peut donc se référer à L\MYCONST et L\MyFunction() plutôt qu'à leurs noms pleinement qualifiés.

La seconde déclaration de use est plus intéressante. Elle définit 'obj' comme alias pour la classe MyClass au sein de l'espace de noms App\Lib2\. Cela n'est possible que pour les classes, pas pour des constantes ou des fonctions. Nous pouvons maintenant utiliser new Obj() ou exécuter des méthodes statiques, comme indiqué ci-dessus.

Résultat

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

V. Les règles de résolution de noms en PHP

Les noms d'identifiants en PHP sont résolus en utilisant les règles d'espace de noms suivant. Reportez-vous au manuel PHP pour plus d'information.

  1. Les appels à des fonctions pleinement qualifiées, des classes ou des constantes sont résolues au moment de la compilation.
  2. Les noms qualifiés ou non sont convertis selon les règles d'importation, par exemple si le nom A\B\C est importé en tant que C, un appel à C\D\e() est traduit en A\B\C\D\e().
  3. L'intérieur d'un espace de noms, tous les noms qualifiés qui ne sont pas déjà convertis selon les règles d'importation ont l'espace de noms courant préfixé, par exemple si un appel à C\D\e() est effectué au sein de l'espace de noms A\B, il est traduit à A\B\C\D\e().
  4. Les noms de classes non qualifiées sont traduits selon les règles actuelles d'importation et le nom complet est remplacé par le nom importé court, par exemple si la classe C dans un espace de noms \B est importée sous X, new X() est traduit en new A\B\C().
  5. Les appels de fonctions non qualifiées au sein d'un espace de noms sont résolus au moment de l'exécution. Par exemple, si MyFunction() est appelée dans l'espace de noms A\B, PHP cherche d'abord la fonction \A\B\MyFunction(). Si elle n'est pas trouvée, il cherche \MyFunction() dans l'espace global.
  6. Les appels à des noms de classes non qualifiés ou qualifiés sont résolus au moment de l'exécution. Par exemple, si nous appelons new C() au sein de l'espace de noms A\B, PHP va chercher la classe A\B\C. Si elle n'est pas trouvée, il va tenter de charger automatiquement A\B\C.

VI. Liens

Vous pouvez aussi aller voir mes autres traductions.

Merci à Wachter pour sa relecture orthographique.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

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.