(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\foo; un usage
tel que foo() correspond au nom A\B\foo.
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"
?>