Espace de noms PHP
Espace de noms PHP (espace de noms)
L'espace de noms PHP (espace de noms) a été ajouté dans PHP 5.3 Si vous avez étudié C# et Java, alors l'espace de noms n'a rien de nouveau. Cependant, cela a toujours une importance très importante en PHP.
L'espace de noms PHP peut résoudre les deux types de problèmes suivants :
1. Conflits de noms entre le code écrit par l'utilisateur et les classes/fonctions/constantes internes de PHP ou les classes/fonctions/constantes tierces.
2. Créez un nom d'alias (ou court) pour un nom d'identifiant très long (généralement défini pour atténuer le premier type de problème) afin d'améliorer la lisibilité du code source.
Définir l'espace de noms
Par défaut, tous les noms de constantes, de classes et de fonctions sont placés dans l'espace global, tout comme PHP prend en charge la dénomination de l'espace. le même qu'avant.
Un espace de noms est déclaré à l'aide du mot-clé namespace. Si un fichier contient un espace de noms, il doit déclarer l'espace de noms avant tout autre code. Le format de syntaxe est le suivant :
< ?php // 定义代码在 'MyProject' 命名空间中 namespace MyProject; // ... 代码 ...
Vous pouvez également définir différents codes d'espace de noms dans le même fichier, tels que :
< ?php namespace MyProject1; // MyProject1 命名空间中的PHP代码 namespace MyProject2; // MyProject2 命名空间中的PHP代码 // 另一种语法 namespace MyProject3 { // MyProject3 命名空间中的PHP代码 } ?>
Le seul code légal avant de déclarer un espace de noms est destiné à définir le fichier source. Encodage de l'instruction de déclaration. Tout code non PHP, y compris les espaces, ne doit pas apparaître avant une déclaration d'espace de noms.
Le code suivant provoquera une erreur de syntaxe :
” 会致命错误 - 命名空间必须是程序脚本的第一条语句 ?>
Subnamespace
et répertoire Tout comme les fichiers, les espaces de noms PHP vous permettent également de spécifier des noms d'espaces de noms hiérarchiques. Par conséquent, les noms d'espaces de noms peuvent être définis de manière hiérarchique :
L'exemple ci-dessus crée la constante MyProjectSubLevelCONNECT_OK, la classe MyProjectSubLevelConnection et la fonction MyProjectSubLevelConnect.
Utilisation de l'espace de noms
Les noms de classe dans l'espace de noms PHP peuvent être référencés de trois manières :
1. Noms non qualifiés ou noms de classe sans préfixes, tels que $a=new foo( ou foo: :staticmethod()); ;. Si l'espace de noms actuel est currentnamespace, foo sera résolu en currentnamespacefoo. Si le code utilisant foo est global et ne contient de code dans aucun espace de noms, foo sera résolu comme foo. Avertissement : Si une fonction ou une constante dans l'espace de noms n'est pas définie, la fonction ou le nom de constante non qualifié est résolu en une fonction globale ou un nom de constante.
2. Nom qualifié ou nom contenant un préfixe, tel que $a = new subnamespacefoo(); ou subnamespacefoo::staticmethod();. Si l'espace de noms actuel est currentnamespace, foo sera résolu en currentnamespacesubnamespacefoo. Si le code utilisant foo est global, code non contenu dans aucun espace de noms, foo sera résolu en subnamespacefoo.
3. Nom complet, ou un nom qui inclut un opérateur de préfixe global, par exemple, $a = new currentnamespacefoo(); ou currentnamespacefoo::staticmethod();. Dans ce cas, foo est toujours résolu en nom littéral currentnamespacefoo dans le code.
Ce qui suit est un exemple d'utilisation de ces trois méthodes :
code de fichier file1.php
code de fichier file2.php
Notez que pour accéder à n'importe quelle classe, fonction ou constante globale, vous pouvez utiliser un nom complet, tel que strlen() ou Exception ou INI_ALL.
Accédez aux classes, fonctions et constantes globales à l'intérieur d'un espace de noms :
Espaces de noms et fonctionnalités de langage dynamiques
L'implémentation des espaces de noms PHP est affectée par la nature dynamique du langage lui-même. Donc, si vous souhaitez convertir le code ci-dessous en espace de noms, accédez aux éléments de manière dynamique.
code de fichier exemple1.php :
Doit utiliser un nom complet (nom de classe incluant le préfixe d'espace de noms). Notez que la barre oblique inverse n'est pas nécessaire car il n'y a aucune différence entre les noms qualifiés et complets dans les noms de classes dynamiques, les noms de fonctions ou les noms de constantes.
Accès dynamique aux éléments de l'espace de noms
mot-clé de l'espace de noms et constantes __NAMESPACE__
PHP prend en charge deux méthodes abstraites pour accéder aux éléments dans l'espace de noms actuel, la constante magique __NAMESPACE__ et le mot-clé d'espace de noms.
La valeur de la constante __NAMESPACE__ est une chaîne contenant le nom de l'espace de noms actuel. Dans le code global, non inclus dans aucun espace de noms, il contient une chaîne vide.
Exemple __NAMESPACE__, code dans l'espace de noms
Exemple __NAMESPACE__, code global
La constante __NAMESPACE__ est utile lors de la création dynamique de noms, par exemple :
Utilisez __NAMESPACE__ pour créer dynamiquement des noms
L'espace de noms de mot-clé peut être utilisé pour accéder explicitement aux éléments de l'espace de noms ou des sous-espaces de noms actuels. C'est l'équivalent de l'auto-opérateur en classe.
opérateur d'espace de noms, code dans l'espace de noms
opérateur d'espace de noms, code global
utilise l'espace de noms :Alias/Import
La prise en charge des espaces de noms PHP propose deux manières d'utiliser les alias ou les importations : utiliser des alias pour les noms de classe ou utiliser des alias pour les noms d'espace de noms. Notez que PHP ne prend pas en charge l'importation de fonctions ou de constantes.
En PHP, les alias sont implémentés via l'opérateur use. Voici un exemple d'utilisation des trois méthodes d'importation possibles :
1. Utilisez l'opérateur use pour importer/utiliser des alias
.2. Une ligne contient plusieurs instructions d'utilisation
L'opération d'importation est exécutée lors de la compilation, mais le nom de la classe dynamique, le nom de la fonction ou le nom de la constante ne l'est pas.
3. Import et noms dynamiques
De plus, l'opération d'import n'affecte que les noms non qualifiés et les noms qualifiés. Les noms pleinement qualifiés ne sont pas affectés par les importations car ils sont déterministes.
4. Importation et nom complet
Utilisation d'espaces de noms : fonctions/constantes globales de secours
Dans un espace de noms, lorsque PHP rencontre une classe, une fonction ou un nom de constante non qualifié, il utilise une stratégie de priorité différente pour résoudre le nom. Les noms de classe sont toujours résolus en noms dans l'espace de noms actuel. Par conséquent, lorsque vous accédez à des noms de classe à l'intérieur du système ou non inclus dans l'espace de noms, vous devez utiliser des noms complets, par exemple :
1. Accédez aux classes globales dans l'espace de noms
Pour les fonctions et Pour les constantes, si la fonction ou la constante n'existe pas dans l'espace de noms actuel, PHP reviendra à utiliser la fonction ou la constante dans l'espace global.
2. Fonctions/constantes globales sauvegardées dans l'espace de noms
Espace global
Si aucun espace de noms n'est défini, toutes les classes et fonctions sont définies dans l'espace global, tout comme avant que PHP n'introduise le concept d'espace de noms. Le préfixe d'un nom indique que le nom se trouve dans l'espace global, même s'il se trouve dans un autre espace de noms.
Utiliser les instructions de l'espace global
L'ordre des espaces de noms
Puisqu'il y a des espaces de noms après cela, la chose la plus sujette aux erreurs est lors de l'utilisation d'une classe, quel est le chemin de recherche pour cette classe.
La résolution de noms suit les règles suivantes :
1 Les appels aux fonctions, classes et constantes avec des noms complets sont résolus au moment de la compilation. Par exemple, le nouveau AB se résout en classe AB.
2. Tous les noms non qualifiés et les noms qualifiés (noms non pleinement qualifiés) sont convertis au moment de la compilation selon les règles d'importation en vigueur. Par exemple, si l'espace de noms ABC était importé en tant que C, alors les appels à CDe() seraient convertis en ABCDe().
3. Dans l'espace de noms, tous les noms qualifiés qui ne sont pas convertis selon les règles d'importation auront le nom actuel de l'espace de noms devant eux. Par exemple, si CDe() est appelé dans l'espace de noms AB, CDe() sera converti en ABCDe().
4. Les noms de classe non qualifiés sont convertis au moment de la compilation selon les règles d'importation actuelles (les noms complets sont utilisés à la place des noms d'importation courts). Par exemple, si l'espace de noms ABC est importé en tant que C, alors new C() est converti en new ABC() .
5. Dans un espace de noms (par exemple AB), les appels de fonction vers des noms non qualifiés sont résolus au moment de l'exécution. Par exemple, un appel à la fonction foo() est analysé comme ceci :
1. Recherchez une fonction nommée ABfoo() dans l'espace de noms actuel
2 Essayez de trouver et d'appeler la fonction globale foo. () dans l'espace.
6. Les appels à des noms non qualifiés ou à des classes de noms qualifiés (noms non pleinement qualifiés) dans un espace de noms (par exemple AB) sont résolus au moment de l'exécution. Voici le processus d'analyse d'appel de new C() et new DE() : Analyse de new C() :
1. Recherchez la classe ABC dans l'espace de noms actuel.
2. Essayez de charger automatiquement la classe ABC.
Nouvelle analyse DE() :
3. Ajoutez le nom de l'espace de noms actuel devant le nom de la classe pour devenir : ABDE, puis recherchez la classe.
4. Essayez de charger automatiquement la classe ABDE.
Afin de faire référence à une classe globale dans l'espace de noms global, le nom complet new C() doit être utilisé.