PHP
downloads | documentation | faq | getting help | mailing lists | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

Les exceptions> <Les espaces de noms
Last updated: Fri, 14 Nov 2008

view this page in

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
?>


add a note add a note User Contributed Notes
Règles de résolution de noms
sean dot mccleary at gmail dot com
09-Oct-2008 02:28
Watch out if you're using class auto-loading.

If you are working in namespace "A", and want to auto-load the class "Person" which is defined in the global namespace, it won't work because the __autoload function will be passed "A::Person" as a parameter.

You must specify you want to use the class ::Person.
Will
20-Feb-2008 06:08
Agreed.  Dennis is right on with this.  To add on, requiring each file that includes a namespace also defeats the purpose of namespacing.  It makes more sense if you have a repository for namespaces and just use those.

Example:

/some/path/to/namespaces/

<?php

use Some::Namespace;

// Test is withing Namespace.
$t = new Test();
// Test2 is not, so it checks includes, etc.
$t = new Test2();

?>

Les exceptions> <Les espaces de noms
Last updated: Fri, 14 Nov 2008
 
 
show source | credits | sitemap | contact | advertising | mirror sites