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 :

  1. 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.
  2. 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().
  3. 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().
  4. 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().
  5. 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 :
    1. Il recherche une fonction dans l'espace de noms courant : A\B\foo().
    2. Il essaie de trouver et appeler la fonction globale foo().
  6. 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() :
    1. Il recherche une classe dans l'espace de noms courant : A\B\C.
    2. Il appelle l'autoload pour A\B\C.
    Pour new D\E():
    1. Il recherche une classe dans l'espace de noms courant : A\B\D\E.
    2. Il appelle l'autoload pour A\B\D\E.
    Pour r�f�rencer une classe globale dans l'espace de noms global, son nom absolu new \C() doit �tre utilis�.

Exemple #1 Exemples de r�solutions d'espaces de noms

<?php
namespace A;
use 
B\DC\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"
?>