Les espaces de noms
PHP Manual

Règles de résolution de noms

Les noms sont résolus suivant ces règles de résolution :

  1. Toutes les noms qualifiés sont traduis au moment de la compilation suivant les règles d'importation courantes. Par exemple, si l'espace de noms A::B::C est importé, un appel à C::D::e() est traduis en A::B::C::D::e().
  2. Les noms de classes non-qualifiés sont traduis au moment de la compilation suivant les règles d'importation courantes (les noms complets sont substitués par le nom court importé). Par exemple, si l'espace de noms A::B::C est importé, new C() est traduit en new A::B::C().
  3. Dans un espace de noms, les appels aux fonctions non-qualifiées qui sont définies dans l'espace de noms courant (et qui sont connues au moment où l'appel est analysé), sont interprétés comme des appels aux fonctions de l'espace de noms, au moment de la compilation.
  4. Dans un espace de noms (comme A::B), les appels aux fonctions non-qualifiées qui ne sont pas définies dans l'espace de noms courant sont résolus au moment de la compilation. Voici comme un appel à la fonction foo() est résolu :
    1. On recherche une fonction depuis l'espace de noms courant : A::B::foo().
    2. Ensuite, on tente de chercher et d'appeler la fonction interne foo().
    Pour appeler une fonction définie par l'utilisateur dans l'espace de noms global, ::foo() doit être utilisé.
  5. Dans un espace de noms (comme A::B), les appels aux noms de classes non-qualifiées sont résolus au moment de l'exécution. Voici comment un appel à new C() est résolu :
    1. On recherche une classe depuis l'espace de noms courant : A::B::C.
    2. Ensuite, on tente de chercher et d'appeler la classe interne C.
    3. Puis, on charge automatiquement A::B::C.
    Pour référencer une classe définie par l'utilisateur dans l'espace de noms global, new ::C() doit être utilisé.
  6. Les appels aux fonctions qualifiées sont résolues au moment de l'exécution. Voici comment un appel à A::B::foo() est résolu :
    1. On recherche une fonction foo() dans l'espace de noms A::B.
    2. Puis, on cherche une classe A::B et on appelle sa méthode statique foo(). On charge automatiquement la classe si nécessaire.
  7. Les noms de classes qualifiés sont résolus au moment de la compilation comme une classe depuis l'espace de noms correspondant. Par exemple, new A::B::C() se réfère à la classe C depuis l'espace de noms A::B.

Exemple #1 Illustration de la résolution de nom

<?php
namespace A
;

// Appels de fonctions

foo();      // Tout d'abord, on tente d'appeler "foo", définie dans l'espace de noms "A"
            // puis, on appèle la fonction interne "foo"

::foo();    // Appel de la fonction "foo", définie dans l'espace global

// Références des classes

new B();    // Tout d'abord, on tente de créer un objet de la classe "B", défini dans l'espace
            // de noms "A", puis, on crée l'objet dans la classe interne "B"

new ::B();  // On crée un objet de la classe "B", défini dans l'espace global

// fonctions statiques de méthodes et d'espace de noms depuis un autre espace de noms

B::foo();   // Tout d'abors, on tente d'appeler la fonction "foo" depuis l'espace de noms "A::B",
            // puis, on appèle la méthode "foo" de la classe interne "B"

::B::foo(); // Tout d'abord, on tente d'appeler la fonction "foo" depuis l'espace de noms "B",
            // puis, on appèle la méthode "foo" de la classe "B" depuis l'espace global

// fonctions statiques de méthodes et d'espace de noms depuis l'espace de noms courant

A::foo();   // Tout d'abord, on tente d'appeler la fonction "foo" depuis l'espace de noms "A::A",
            // puis, on tente d'appeler la méthode "foo" de la classe "A" depuis l'espace de noms "A",
            // puis, on tente d'appeler la fonction "foo" depuis l'espace de noms "A",
            // puis, on appèle la méthode "foo" de la classe interne "A"

::A::foo(); // Tout d'abord, on tente d'appeler la fonction "foo" depuis l'espace de noms "A",
            // puis, on appèle la méthode "foo" de la classe "A" depuis l'espace global
?>

Les espaces de noms
PHP Manual