Règles de résolutions de noms
(PHP 5 >= 5.3.0, PHP 7)
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. L'espace de noms Foo est aussi un nom absolu.
- Nom Relatif
-
C'est un identifiant commençant par namespace, tel que namespace\Foo\Bar.
Les noms sont résolus en suivant les règles suivantes :
- Les noms absolus se traduisent toujours par les noms sans le séparateur de namespace. Par exemple, \A\B se traduit par A\B.
- Tous les noms qui ne sont pas absolus sont traduit avec le namespace remplacé par le namespace courant. Si le nom apparait dans le namespace global, le prefixe namespace\ est retiré. Par exemple namespace\A dans le namespace X\Y se traduit par X\Y\A. Le même nom dans le namespace global se traduit par A.
- Pour les noms absolus, le premier segment est traduit en accord avec la class/namespace de la table d'importation. Par exemple, si le namespace A\B\C est importé comme C, le nom C\D\E est traduit par A\B\C\D\E.
- Pour les noms absolus, si aucune règle d'import ne s'applique, le namespace courant est préfixé par le nom. Par exemple le nom C\D\E dans le namespace A\B, est traduit par A\B\C\D\E.
- Pour les noms absolus, le nom est traduit en lien avec la table courante d'importation pour le type de symbol respectif. Cela signifie qu'un nom ressemblant à une classe est traduit en accord avec la table d'importation des class/namespace, les noms de fonctions en utilisant la table d'importation des fonctions, et les constantes en utilisant la table d'importation des constantes. Par exemple, après use A\B\C; un usage tel que new C() correspond au nom A\B\C(). De la même manière, après use function A\B\fn; un usage tel que fn() correspond au nom A\B\fn.
- Pour les noms relatifs, si aucune règle ne s'applique, et que le nom fait référence à une classe, le namespace courant sert de préfixe. Par exemple new C() dans le namespace A\B correspond au nom A\B\C.
-
pour les noms relatifs, si aucune règle ne s'applique, et que le nom
fait référence à une fonction ou une constante, et que le code est en
dehors du namespace global, the nom est résolu par l'execution.
Supposons que le code est dans le namespace
A\B, voici comme un appel à la fonction 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().
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(); // 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(); // 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(); // 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" située dans l'espace de noms global
// 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"
// si la classe "A\B" n'est pas trouvée, il essaie l'autoload sur la classe "A\B"
?>
Version en cache
22/12/2024 18:44:55 Cette version de la page est en cache (à la date du 22/12/2024 18:44:55) afin d'accélérer le traitement. Vous pouvez activer le mode utilisateur dans le menu en haut pour afficher la dernère version de la page.Document créé le 30/01/2003, dernière modification le 26/10/2018
Source du document imprimé : https://www.gaudry.be/php-rf-language.namespaces.rules.html
L'infobrol est un site personnel dont le contenu n'engage que moi. Le texte est mis à disposition sous licence CreativeCommons(BY-NC-SA). Plus d'info sur les conditions d'utilisation et sur l'auteur.
Références
Ces références et liens indiquent des documents consultés lors de la rédaction de cette page, ou qui peuvent apporter un complément d'information, mais les auteurs de ces sources ne peuvent être tenus responsables du contenu de cette page.
L'auteur de ce site est seul responsable de la manière dont sont présentés ici les différents concepts, et des libertés qui sont prises avec les ouvrages de référence. N'oubliez pas que vous devez croiser les informations de sources multiples afin de diminuer les risques d'erreurs.