R�gles de r�solutions de noms
Dans le cadre des r�gles de r�solution, il y a plusieurs d�finitions importantes :
-
D�finitions pour les espaces de noms
- nom non qualifi�
-
Ceci est un identifiant ne contenant pas un s�parateur d'espace de noms. Par exemple : Foo
- nom qualifi�
-
Ceci est un identifiant contenant un s�parateur d'espace de noms. Par exemple : Foo\Bar
- Nom absolu
-
Ceci est un identifiant qui commence par un s�parateur d'espace de noms. Par exemple : \Foo\Bar. namespace\Foo est aussi un nom absolu.
Les noms sont r�solus en suivant les r�gles suivantes :
- Les appels � des espaces de noms absolus pour des fonctions, classes ou constantes sont r�solus � la compilation. Par exemple, new \A\B utilise la classe A\B.
- Tous les noms qui ne sont pas absolus sont traduits durant la compilation � l'aide des r�gles d'importation. Par exemple, si le nom A\B\C est import� sous l'alias C, un appel � C\D\e() est traduit en un appel � A\B\C\D\e().
- Dans un nom de domaine, tous les noms qualifi�s qui ne sont pas traduits � l'aide des r�gles d'importation sont pr�fix�s avec l'espace de noms courant. Par exemple, si un appel � C\D\e() est effectu� dans l'espace de noms A\B, il est traduit en A\B\C\D\e().
- Les classes non qualifi�es sont traduites durant la compilation en fonction des r�gles d'importations (le nom complet remplace les noms courts). Par exemple, si l'espace de noms A\B\C est import� sous le nom C, new C() est remplac� par new A\B\C().
-
Dans un espace de noms, tel que A\B, les appels � des fonctions sans qualification
sont r�solus � la compilation. Voici comment un appel � foo()
est r�solu :
- Il recherche une fonction dans l'espace de noms courant : A\B\foo().
- Il essaie de trouver et appeler la fonction globale foo().
-
Dans un espace de noms, e.g. A\B, un appel
� une classe qualifi�e ou non qualifi�e (pas absolue), est r�solu
� l'ex�cution. Voici comment un appel � new C()
ou � new D\E() est r�solu.
Pour new C() :
- Il recherche une classe dans l'espace de noms courant : A\B\C.
- Il appelle l'autoload pour A\B\C.
- Il recherche une classe dans l'espace de noms courant : A\B\D\E.
- Il appelle l'autoload pour A\B\D\E.
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'autoload sur la classe "A\B"
new D(); // using import rules, cr�e un objet de la classe "D" d�finie dans l'espace de noms "B"
// si non trouv�, il essaie l'autoload sur la classe "B\D"
new F(); // using import rules, cr�e un objet de la classe "E" d�finie dans l'espace de noms "C"
// si non trouv�, il essaie l'autoload 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'autoload 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'autoload 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'autoload 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'autoload sur la classe "A\B"
D::foo(); // using import rules, 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'autoload 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" from global scope
// si la classe "B" n'est pas trouv�e, il essaie l'autoload 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'autoload sur la classe "A\A\B"
\A\B::foo(); // appelle la m�thode "foo" de la classe "B" de l'espace de noms "A\B"
// si la classe "A\B" n'est pas trouv�e, il essaie l'autoload sur la classe "A\B"
?>