(PHP 5 >= 5.3.0, PHP 7, PHP 8)
Dans le cadre des règles de résolution, il y a plusieurs définitions importantes :
Ceci est un identifiant ne contenant pas un séparateur d'espace de noms.
Par exemple : Foo
Ceci est un identifiant contenant un séparateur d'espace de noms.
Par exemple : Foo\Bar
Ceci est un identifiant qui commence par un séparateur d'espace de noms.
Par exemple : \Foo\Bar
. L'espace de noms Foo
est aussi un nom absolu.
C'est un identifiant commençant par namespace
, tel que
namespace\Foo\Bar
.
Les noms sont résolus en suivant les règles suivantes :
\A\B
se traduit par A\B
.
namespace
remplacé par le namespace courant.
Si le nom apparait dans le namespace global, le préfixe
namespace\
est retiré. Par exemple namespace\A
dans le namespace X\Y
se traduit par X\Y\A
.
Le même nom dans le namespace global se traduit par A
.
A\B\C
est importé comme C
, le nom C\D\E
est traduit par A\B\C\D\E
.
C\D\E
dans le namespace A\B
,
est traduit par A\B\C\D\E
.
use A\B\C;
un usage tel que new C()
correspond au nom
A\B\C()
. De la même manière, après use function A\B\fn;
un usage tel que fn()
correspond au nom A\B\fn
.
new C()
dans le namespace
A\B
correspond au nom A\B\C
.
A\B
, voici comme un appel à la fonction foo()
est résolu :
A\B\foo()
.
foo()
.
Exemple #1 Exemples de résolutions d'espaces de noms
<?php
namespace A;
use B\D, C\E as F;
// appels de fonctions
foo(); // tente d'appeler la fonction "foo" dans l'espace de noms "A"
// puis appelle la fonction globale "foo"
\foo(); // appelle la fonction "foo" définie dans l'espace de noms global
my\foo(); // appelle la fonction "foo" définie dans l'espace de noms "A\my"
F(); // tente d'appeler la fonction "F" définie dans l'espace "A"
// puis tente d'appeler la fonction globale "F"
// référence de classes references
new B(); // crée un objet de la classe "B" définie dans l'espace de noms "A"
// si non trouvé, il essaie l'autochargement sur la classe "A\B"
new D(); // crée un objet de la classe "D" définie dans l'espace de noms "B"
// si non trouvé, il essaie l'autochargement sur la classe "B\D"
new F(); // crée un objet de la classe "E" définie dans l'espace de noms "C"
// si non trouvé, il essaie l'autochargement sur la classe "C\E"
new \B(); // crée un objet de la classe "B" définie dans l'espace de noms global
// si non trouvé, il essaie l'autochargement sur la classe "B"
new \D(); // crée un objet de la classe "D" définie dans l'espace de noms global
// si non trouvé, il essaie l'autochargement sur la classe "D"
new \F(); // crée un objet de la classe "F" définie dans l'espace de noms global
// si non trouvé, il essaie l'autochargement sur la classe "F"
// méthodes statiques et fonctions d'espace de noms d'un autre espace
B\foo(); // appelle la fonction "foo" de l'espace de noms "A\B"
B::foo(); // appelle la méthode "foo" de la classe "B" définie dans l'espace de noms "A"
// si la classe "A\B" n'est pas trouvée, il essaie l'autochargement sur la classe "A\B"
D::foo(); // appelle la méthode "foo" de la classe "D" définie dans l'espace de noms "B"
// si la classe "B\D" n'est pas trouvée, il essaie l'autochargement sur la classe "B\D"
\B\foo(); // appelle la fonction "foo" de l'espace de noms "B"
\B::foo(); // appelle la méthode "foo" de la classe "B" située dans l'espace de noms global
// si la classe "B" n'est pas trouvée, il essaie l'autochargement sur la classe "B"
// méthodes statiques et fonctions d'espace de noms de l'espace courant
A\B::foo(); // appelle la méthode "foo" de la classe "B" de l'espace de noms "A\A"
// si la classe "A\A\B" n'est pas trouvée, il essaie l'autochargement sur la classe "A\A\B"
\A\B::foo(); // appelle la méthode "foo" de la classe "B" de l'espace de noms "A"
// si la classe "A\B" n'est pas trouvée, il essaie l'autochargement sur la classe "A\B"
?>