Introduction▲
A titre d'exemple, nous allons définir deux blocs de code presque identique, la seule différence est leur espace de noms :
<?php
// application library 1
namespace
App\Lib1;
const
MYCONST =
'App\Lib1\MYCONST'
;
function
MyFunction() {
return
__FUNCTION__
;
}
class
MyClass {
static
function
WhoAmI() {
return
__METHOD__
;
}
}
?>
<?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 :
<?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 :
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 :
<?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 :
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.
<?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
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.
- Les appels à des fonctions pleinement qualifiées, des classes ou des constantes sont résolues au moment de la compilation.
- 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().
- 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().
- 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().
- 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.
- 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.