Cela a été un parcours chaotique, en ce qui concerne la prise en charge des espaces de noms en PHP. Heureusement, il a été ajouté au langage en PHP 5.3 et la structure applicable du code PHP s'est grandement améliorée depuis. Mais comment les utilisons-nous exactement?
"N'oubliez pas d'échapper à la barre oblique inverse lorsque vous stockez un nom d'espace de nom dans une chaîne!"
Imaginez un espace de noms comme un tiroir dans lequel vous pouvez placer toutes sortes d'objets: un crayon, une règle, un morceau de papier, etc. Ce sont tes affaires. Juste sous votre tiroir se trouve quelqu'un d'autre et il y met les mêmes choses. Pour éviter d’utiliser les objets les uns des autres, vous décidez d’étiqueter les tiroirs de manière à ce qu’il appartienne à qui.
Auparavant, les développeurs devaient utiliser des traits de soulignement dans leurs classes, fonctions et constantes pour séparer les bases de code. Cela équivaut à étiqueter les objets de chacun et à les mettre dans un grand tiroir. Bien sûr, c'est au moins une sorte d'organisation, mais c'est très inefficace.
Les noms à la rescousse! Vous pouvez déclarer les mêmes définitions de fonction, de classe, d'interface et de constante dans des espaces de noms distincts sans recevoir d'erreur fatale. Essentiellement, un espace de noms n'est rien d'autre qu'un bloc de code hiérarchiquement étiqueté contenant du code PHP standard.
Il est important de garder à l'esprit que vous utilisez indirectement les espaces de noms; depuis PHP 5.3, toutes les définitions qui ne sont pas encore déclarées dans un espace de noms défini par l'utilisateur entrent dans l'espace de noms global.
L’espace de noms global contient également toutes les définitions PHP internes, comme écho()
, mysqli_connect ()
, et le Exception
classe. Parce que l’espace de noms global n’a pas de nom d’identification unique, son nom le plus souvent appelé espace global.
Notez que l'utilisation de l'espacement de noms n'est pas une obligation.
Votre script PHP fonctionnera parfaitement sans eux, et ce comportement ne va pas changer très bientôt.
Une définition d’espace de noms est la première déclaration que l’interprète PHP doit rencontrer dans un fichier PHP. La seule déclaration autorisée au-dessus d’une déclaration d’espace de nom est une déclarer
instruction, et encore, seulement si elle déclare le codage du script.
Déclarer un espace de noms est aussi simple que d’utiliser le espace de noms
mot-clé. Un nom d'espace de noms doit obéir aux mêmes règles que les autres identifiants PHP. Par conséquent, un espace de noms doit commencez par une lettre ou un trait de soulignement, suivi d'un nombre quelconque de lettres, de chiffres ou de traits de soulignement.
Si vous souhaitez affecter un bloc de code à l’espace global, vous utilisez la commande
espace de noms
mot-clé sans nom.Vous êtes autorisé à avoir plusieurs espaces de noms dans le même fichier.
Vous pouvez également disperser le même espace de noms dans différents fichiers. le processus d'inclusion de fichier les fusionne automatiquement. Par conséquent, il est recommandé de limiter le nombre de définitions d’espace de noms à un par fichier, comme vous le feriez avec des classes..
L'espacement de noms est utilisé pour éviter les conflits de définitions et introduit plus de flexibilité et d'organisation dans votre base de code..
Notez que les crochets entourant le bloc de code d'espace de noms sont complètement facultatifs. En fait, si vous vous en tenez à la règle de un espace de nom par fichier et en omettant les accolades, votre code sera beaucoup plus propre. Il n'est pas nécessaire d'indenter le code imbriqué..
Sous-espaces de noms
Les espaces de noms peuvent suivre une certaine hiérarchie, un peu comme les répertoires du système de fichiers de votre ordinateur. Les sous-espaces de noms sont extrêmement utiles pour organiser la structure d'un projet. Par exemple, si votre projet nécessite un accès à la base de données, vous pouvez placer tout le code associé à la base de données, tel qu'une exception de base de données et un gestionnaire de connexion, dans un sous-espace de noms appelé
Base de données
.Pour conserver la flexibilité, il est sage de stocker les sous-espaces de noms dans des sous-répertoires. Cela encourage la structuration de votre projet et facilite beaucoup l'utilisation d'autoloaders qui suivent la norme PSR-0..
PHP utilise le barre oblique inverse comme séparateur d'espace de noms.
Fait amusant: dans la RFC pour décider du séparateur d'espace de noms à utiliser, ils ont même envisagé d'utiliser un smiley.// mon projet / base de données / connection.phpVous pouvez avoir autant de sous-espaces de noms que vous voulez.
La définition d'espaces de noms avec des blocs de code imbriqués n'est pas prise en charge. L'exemple suivant génère une erreur fatale très descriptive: "Les déclarations d'espace de noms ne peuvent pas être imbriquées".
Code d'appel à partir d'un espace de noms
Si vous souhaitez instancier un nouvel objet, appeler une fonction ou utiliser une constante d'un autre espace de noms, vous utilisez la notation barre oblique inverse. Ils peuvent être résolus de trois points de vue différents:
C'est le nom d'une classe, d'une fonction ou d'une constante sans inclure de référence à un espace de noms. Si vous êtes novice en namespacing, c’est le point de vue avec lequel vous êtes habitué à travailler..
Nom qualifié
Voici comment nous accédons à la hiérarchie de sous-espaces de noms; il utilise la notation de barre oblique inverse.
L'exemple ci-dessous génère une erreur irrécupérable: "Erreur irrécupérable: Classe 'MonProjet \ Base de données \ MonProjet \ FileAccess \ Entrée' introuvable", car
MyProject \ FileAccess \ Input
est approché par rapport à l'espace de noms dans lequel vous vous trouvez actuellement.Nom complet
Les noms non qualifiés et qualifiés sont tous deux relatifs à l'espace de noms actuel. Ils ne peuvent être utilisés que pour accéder aux définitions de ce niveau ou pour approfondir la hiérarchie des espaces de noms..
Si vous souhaitez accéder à une fonction, une classe ou une constante résidant à un niveau supérieur de la hiérarchie, vous devez utiliser le nom complet, un chemin absolu plutôt que relatif. Cela revient à préparer votre appel avec une barre oblique inverse. Cela permet à PHP de savoir que cet appel doit être résolu depuis l’espace global au lieu de l’approcher relativement.
Il n'est pas nécessaire d'utiliser le nom complet des fonctions PHP internes. Appeler un nom non qualifié pour une constante ou une fonction qui n’existe pas dans l’espace de nommage dans lequel vous travaillez actuellement, les résultats en PHP recherchent l’espace de nommage global pour eux. Il s'agit d'une solution de secours intégrée qui ne s'applique pas aux noms de classe non qualifiés..
En gardant cela à l'esprit, nous pouvons maintenant surcharger les fonctions internes de PHP tout en pouvant appeler la fonction d'origine (ou une constante d'ailleurs)..
';Appels dynamiques
PHP est un langage de programmation dynamique. afin que vous puissiez également appliquer cette fonctionnalité pour appeler du code namespaced. Cela revient essentiellement à instancier des classes de variables ou à inclure des fichiers de variables. Le séparateur d’espace de nommage utilisé par PHP est également un méta-caractère dans les chaînes. N'oubliez pas d'échapper à la barre oblique inverse lorsque vous stockez un nom d'espace de nom dans une chaîne!
le
espace de noms
Mot-cléNon seulement le
espace de noms
mot-clé utilisé pour définir un espace de noms, il peut également être utilisé pour résoudre explicitement l’espace de noms actuel, fonctionnellement similaire ausoi
mot clé pour les classes.le
__NAMESPACE__
constantUn peu comme le
soi
mot-clé ne peut pas être utilisé pour déterminer le nom actuel de la classe, leespace de noms
mot-clé ne peut pas être utilisé pour déterminer quel est l'espace de noms actuel. C'est pourquoi nous avons le__NAMESPACE__
constant.Cette constante est très utile pour apprendre si vous débutez avec des espaces de noms; c'est également utile pour le débogage. Comme il s’agit d’une chaîne, il peut également être utilisé en combinaison avec des appels de code dynamique dont nous avons déjà parlé..
Aliasing ou Importation
"ce n'est pas une obligation d'utiliser le namespacing"
Namespacing en PHP supporte importer. L'importation est également appelée aliasing. Seuls les classes, les interfaces et les espaces de noms peuvent être aliasés ou importés.
L'importation est un aspect très utile et fondamental de l'espacement de noms. Il vous permet d'utiliser des packages de code externe, tels que des bibliothèques, sans avoir à vous soucier des noms en conflit. L’importation est réalisée en utilisant le
utilisation
mot-clé. Facultativement, vous pouvez spécifier un alias personnalisé avec lecomme
mot-clé.utilisez [nom de la classe, de l'interface ou de l'espace de noms] comme [alias_custom-optionnel]Comment c'est fait
Un nom qualifié complet peut être associé à un nom non qualifié plus court afin que vous n'ayez pas à écrire son nom qualifié complet à chaque fois que vous souhaitez l'utiliser. La création d'alias ou l'importation doit avoir lieu dans la portée la plus élevée d'un espace de noms ou dans la portée globale. Essayer de le faire dans le cadre d'une méthode ou d'une fonction est une syntaxe non valide.
Alternativement, vous pouvez lui attribuer un autre nom:
Vous êtes également autorisé à importer des classes globales, comme le
Exception
classe. Une fois importé, vous n'avez plus besoin d'écrire son nom complet..Notez que les noms d'importation ne sont pas résolus par rapport à l'espace de noms actuel, mais d'un point de vue absolu, en commençant par l'espace global. Cela signifie qu'une barre oblique inversée n'est ni nécessaire ni recommandée..
Bien qu'il soit possible d'appeler dynamiquement du code namespaced, l'importation dynamique n'est pas prise en charge..
Conclusion
L'espacement de noms est utilisé pour éviter les conflits de définitions et introduit plus de flexibilité et d'organisation dans votre base de code. Rappelez-vous que vous n'êtes pas obligé d'utiliser le namespacing; c'est une fonctionnalité utilisée en combinaison avec un workflow orienté objet. J'espère toutefois que vous envisagerez de faire passer votre (futur) projet PHP à un niveau supérieur en utilisant un espacement de noms. As-tu déjà décidé?