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.
Règles de résolution de noms
Les noms sont résolus suivant ces règles de résolution :
-
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 enA::B::C::D::e(). -
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 ennew A::B::C(). - 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.
-
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 :
- On recherche une fonction depuis l'espace de noms courant : A::B::foo().
- Ensuite, on tente de chercher et d'appeler la fonction interne foo().
-
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 :- On recherche une classe depuis l'espace de noms courant : A::B::C.
- Ensuite, on tente de chercher et d'appeler la classe interne C.
- Puis, on charge automatiquement A::B::C.
new ::C()doit être utilisé. -
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 :
- On recherche une fonction foo() dans l'espace de noms A::B.
- Puis, on cherche une classe A::B et on appelle sa méthode statique foo(). On charge automatiquement la classe si nécessaire.
-
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
?>
Règles de résolution de noms
sean dot mccleary at gmail dot com
09-Oct-2008 02:28
09-Oct-2008 02:28
Will
20-Feb-2008 06:08
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();
?>
