Que sont les espaces de noms?


241

Que sont les espaces de noms PHP?

Que sont les espaces de noms en général?

Une réponse de Layman avec un exemple serait formidable.

Réponses:


574

L'espace de noms fait pour les fonctions et les classes ce que l'étendue fait pour les variables. Il vous permet d'utiliser la même fonction ou le même nom de classe dans différentes parties du même programme sans provoquer de collision de noms.

En termes simples, imaginez un espace de noms comme le nom de famille d'une personne . S'il y a deux personnes nommées "John", vous pouvez utiliser leur nom de famille pour les distinguer.

Le scénario

Supposons que vous écriviez une application qui utilise une fonction nommée output(). Votre output()fonction prend tout le code HTML de votre page et l'envoie à l'utilisateur.

Plus tard, votre application s'agrandit et vous souhaitez ajouter de nouvelles fonctionnalités. Vous ajoutez une bibliothèque qui vous permet de générer des flux RSS. Cette bibliothèque utilise également une fonction nommée output()pour sortir le flux final.

Lorsque vous appelez output(), comment PHP sait-il s'il faut utiliser votre output()fonction ou la fonction de la bibliothèque RSS output()? Ce n'est pas le cas. Sauf si vous utilisez des espaces de noms.

Exemple

Comment résout-on avoir deux output()fonctions? Facile. Nous collons chaque output()fonction dans son propre espace de noms .

Cela ressemblerait à quelque chose comme ceci:

namespace MyProject;

function output() {
    # Output HTML page
    echo 'HTML!';
}

namespace RSSLibrary;

function output(){
    # Output RSS feed
    echo 'RSS!';
}

Plus tard, lorsque nous voulons utiliser les différentes fonctions, nous utilisons:

\MyProject\output();
\RSSLibrary\output();

Ou nous pouvons déclarer que nous sommes dans l'un des espaces de noms, puis nous pouvons simplement appeler cet espace de noms output():

namespace MyProject;

output(); # Output HTML page
\RSSLibrary\output();

Pas d'espaces de noms?

Si nous n'avions pas d'espaces de noms, nous devions (potentiellement) changer beaucoup de code chaque fois que nous ajoutions une bibliothèque, ou trouver des préfixes fastidieux pour rendre nos noms de fonctions uniques. Avec les espaces de noms, nous pouvons éviter le casse-tête des collisions de noms lors du mélange de code tiers avec nos propres projets.


Pour une raison quelconque, je pensais que si vous utilisiez des espaces de noms dans file1, vous n'auriez pas besoin d'exiger ou d'inclure le fichier dans file2. Les tests unitaires ont montré que ce n'était pas le cas.
Aaron Bell

1
@AaronBell Vous voudrez peut-être vérifier le chargement automatique .
cbednarski

21

Un espace de noms vous permet de placer un tas de code sous un nom et de ne pas avoir de conflits de noms avec les classes, les fonctions et les constantes.

Il permet à votre code de vivre dans cet espace de noms.

PHP utilise le caractère quelque peu controversé \ pour afficher les niveaux d'espace de noms. Les gens se sont levés dans les bras parce qu'il est également utilisé comme personnage d'évasion.

Pour utiliser l'espace de noms en PHP, utilisez quelque chose comme ça en haut de votre fichier.

namespace my\namespace;

Vous pouvez trouver beaucoup plus d'informations sur la documentation PHP officielle pour les espaces de noms .


11

Puisqu'il est plus facile d'en apprendre davantage sur le mot-clé «use» en connaissant «namespace», permettez-moi d'abord d'expliquer l'espace de noms en examinant un projet Laravel de base.

Il y a une classe de contrôleur avec le nom: Controller.php qui se trouve dans le chemin: app / Http / Controllers du répertoire racine du projet Il y a aussi une autre classe de contrôleur nommée: Controller.php , mais celle-ci se trouve dans le chemin: vendeur / laravel / framework / src / Illuminate / Routing depuis le répertoire racine du projet

Vous n'avez pas encore besoin de regarder le code source si vous êtes nouveau sur php parce qu'il peut vous dérouter, laissez-moi plutôt vous expliquer la partie de celui-ci qui nous tient à cœur et nous aidera à comprendre "namespace" et "use" ".

Donc, en fait, notre première classe de contrôleur: app / Http / Controllers / Controller.php doit utiliser le fournisseur de la deuxième classe de contrôleur / laravel / framework / src / Illuminate / Routing / Controller.php . il doit en fait étendre cette classe afin d'avoir accès à son contenu pour gérer certaines fonctionnalités de routage cruciales.

Alors, comment une classe peut-elle étendre une autre classe qui porte le même nom? class Controller extends Controller? cela ne fonctionnera PAS, sauf s'il existe un moyen de distinguer ces deux classes et c'est là que cela namespaceest pratique et le usemot - clé aide à terminer la mission de, permettant l'utilisation de; (classes; méthodes; interfaces et constantes), avec le même nom, dans la même portée.

maintenant, comment cela se fait-il dans le code? très simple! si nous regardons lecode source app / Http / Controllers / Controller.php , nous pouvons voir en haut de l'espace de noms de classe est déclaré commenamespace App\Http\Controllers:, c'est ainsi que vous donnez à votre classe un espace de noms afin qu'il puisse être référencé par d'autres classes maintenant cela ressemble au chemin d'accès à cette classe à partir du répertoire racine du projet, avec peu de différence et c'est l'utilisation de "\" au lieu de "/" (identique à l'invite de commande dans Windows) , mais il y a une autre différence et c'est l'application avec le capital «A» dans l'espace de noms par rapport à «app» avec «a» en minuscules dans le chemin. Notez également que l'espace de noms est sensible à la casse.

L'espace de noms est donc un concept distinct de celui du chemin, il peut suivre la structure du chemin si cela aide, mais il ne doit pas nécessairement être le chemin exact de la classe, de la méthode, des interfaces ou des constantes, par exemple jetez un œil à: vendor / laravel / framework /src/Illuminate/Routing/Controller.php code source,

nous voyons en haut de la classe l'espace de noms est déclaré comme: Illuminate\Routing

regardons maintenant le usemot-clé " ", que nous utilisons, le usemot-clé " " pour rendre notre classe consciente d'une classe ou d'une fonction spécifique que nous voulons utiliser dans notre classe

donc nous n'importons ni n'incluons rien que nous informons simplement notre classe que nous utiliserons une classe ou une méthode spécifique en les référençant par leur espace de noms, jetons un œil au code source app / Http / Controllers / Controller.php , comme vous pouvez voir sur la ligne: " use Illuminate\Routing\Controller as BaseController", le usemot-clé " " suivi d'un espace de nom pour la classe cible (notez que Illuminate \ Routing \ Controller.php et Illuminate \ Routing \ Controller 'sans extension .php' sont interchangeables)

nous pouvons utiliser le asmot clé " " avec le usemot clé " " pour donner à une classe, une méthode, des interfaces ou des constantes spécifiques un alias qui permet app / Http / Controllers / Controller.php d'étendre Illuminate \ Routing \ Controller.php comme BaseController dans le ligne: "class Controller extends BaseController".


9

Il existe des techniques comme les espaces de noms dans d'autres langages de programmation (comme les packages en Java). Ils sont utilisés pour pouvoir avoir plusieurs classes avec le même nom dans un projet.

De la documentation php ( http://www.php.net/manual/en/language.namespaces.rationale.php ):

Que sont les espaces de noms? Dans la définition la plus large, les espaces de noms sont un moyen d'encapsuler des éléments. Cela peut être vu comme un concept abstrait dans de nombreux endroits. Par exemple, dans n'importe quel système d'exploitation, les répertoires servent à regrouper les fichiers associés et agissent comme un espace de noms pour les fichiers qu'ils contiennent. À titre d'exemple concret, le fichier foo.txt peut exister à la fois dans le répertoire / home / greg et dans / home / other, mais deux copies de foo.txt ne peuvent pas coexister dans le même répertoire. De plus, pour accéder au fichier foo.txt en dehors du répertoire / home / greg, nous devons ajouter le nom du répertoire au nom du fichier à l'aide du séparateur de répertoire pour obtenir /home/greg/foo.txt. Ce même principe s'étend aux espaces de noms dans le monde de la programmation.


1
La comparaison avec Java est une mauvaise idée. Java a des packages et il existe des classes de visibilité des packages. La visibilité des membres protégés dépend également du package qui y accède.
Artefacto

1
Ils ne sont pas égaux aux packages mais partagent la même idée.
2ndkauboy

Comme la question demande également quels sont les espaces de noms en général, la réponse est logique.
kiamlaluno

@kiam Ils partagent une idée - des noms de classe non conflictuels. Ils ne partagent pas l'idée de visibilité.
Artefacto

@Artefacto: Kau-Boy n'a pas dit que les espaces de noms dans les deux langues étaient les mêmes.
kiamlaluno

4

Un espace de noms fonctionne comme un répertoire. Vous savez comment placer des fichiers dans un répertoire portant les mêmes noms que des fichiers dans le répertoire parent (ou tout autre)? Eh bien, un espace de noms vous permet de le faire dans une application pour les variables, les fonctions et les classes.

Il y a quelque temps, il y avait une tendance en PHP pour les énormes classes de fonctions statiques. La seule façon d'appeler l'une de ces fonctions était de préfixer un appel avec le nom de la classe. C'était une tentative primitive d'espaces de noms, mais avec peu d'avantages.


4

Tout comme les répertoires et les fichiers , l'espace de noms en PHP sert à regrouper les classes , les fonctions , les interfaces et les constantes .

Exemple:

Filesystem      |   PHP Namespace
----------------|------------------
/Dir/File.txt   |  \Namespace\Class

Il fournit un moyen d'envelopper des éléments de l'espace global et permet d'utiliser un nom d'élément simple sans provoquer de collision de noms dans un programme. Il est pris en charge dans PHP 5.3.0, PHP 7.

Mais il y a quelques limites dans l'analogie entre l'espace de noms PHP et le système de fichiers basé sur Unix:

                          | Filesystem            |        PHP Namespace
--------------------------|-----------------------|-------------------------
Cas sensitive             |       No              |        Yes                
--------------------------|-----------------------|-------------------------
Name with plain number    |       Yes             |        No
--------------------------|-----------------------|-------------------------
Path level                |       Yes             |        Yes   
--------------------------|-----------------------|-------------------------
Plain metacharacters name |       Yes             |        No        

Le principe s'étend à l'espace de noms dans le mot de programmation.


2

Un espace de noms vous permet essentiellement de mettre du code dans un conteneur. Cela évitera des problèmes avec deux fonctions (ainsi que des classes et des variables) qui partagent le même nom.

Ils sont utiles lorsque vous travaillez avec des applications plus grandes pour éviter les problèmes avec des morceaux de code partageant le même nom.

Par exemple, supposons que nous voulions deux fonctions appelées "TheMessage". Ces deux imprimeraient (écho) différents messages chacun. Normalement, cela provoquerait une erreur de syntaxe, car vous ne pouvez pas avoir deux fonctions qui partagent le même nom.

Pour résoudre ce problème, vous pouvez placer ces fonctions dans des espaces de noms distincts. Cela vous permettrait d'utiliser les deux fonctions sans aucune erreur.


2

L'espace de noms est comme empaqueter beaucoup de choses dans un seul paquet. Imaginez un espace de noms comme un tiroir dans lequel vous pouvez mettre toutes sortes de choses: un crayon, une règle, un morceau de papier, etc. Pour éviter d'utiliser les articles les uns des autres, vous décidez d'étiqueter les tiroirs de manière à ce que ce soit à qui.


0

L'espace de noms est utilisé pour regrouper un groupe de codes afin qu'ils puissent être utilisés à différents endroits sans conflits de noms. Considérez cela comme une méthode sans conflit jQuery et vous le comprendrez mieux.


1
Qu'entendez-vous par «méthode jQuery no conflict»? Comment est-ce lié à PHP?
Nico Haase

0

Un espace de noms est un système simple pour contrôler les noms dans un programme.
Il garantit que les noms sont uniques et ne mèneront à aucun conflit.


De quels types de "noms" parlez-vous?
Nico Haase du

0

Vous pouvez utiliser l'espace de noms pour éviter les collisions de noms entre le code que vous créez et les classes / fonctions / constantes PHP internes ou les classes / fonctions / constantes tierces. Les espaces de noms ont également la possibilité d'alias (ou de raccourcir) Extra_Long_Names conçus pour réduire le premier problème, améliorant ainsi la lisibilité du code source.

Comme nous le savons tous, les espaces de noms et les traits ne sont pas nouveaux en PHP, mais de nombreux développeurs php n'utilisent toujours pas ces grands concepts en raison de leur complexité. Donc, dans ce post. Je vais essayer de les effacer avec des exemples. Quels sont l'espace de noms et les traits?

Comment les implémenter dans votre code pour rendre votre code réutilisable et extensible?

Avantages des espaces de noms

Vous pouvez utiliser l'espace de noms pour éviter les collisions de noms entre le code que vous créez et les classes / fonctions / constantes PHP internes ou les classes / fonctions / constantes tierces.

Les espaces de noms ont également la possibilité d'alias (ou de raccourcir) Extra_Long_Names conçu pour réduire le premier problème, améliorant ainsi la lisibilité du code source. Comprenons les espaces de noms avec un exemple. créer un nom de dossier «php_oops» dans htdocs (xampp) ou www (xwamp) créer un nouveau dossier sous le répertoire racine nommé «namespaces», puis créer un fichier index.php sous le dossier namespaces.

<?php
// FilePath:- namespaces/index.php

// let's say, we have two classes in index,
// here, these two classes have global space
class A 
{ 
   function __construct()
   { 
      echo "I am at Global space, Class A";
   }
}
class B
{
   function __construct()
   {
      echo "I am at Global space, Class B";
   }
}
// now create an object of class and 
$object = new A; // unqualified class name
echo "<br/>";
$object = new \B; // fully qualified class name
// output: 
I am at Global space, Class A
I am at Global space, Class B

Référence- https://medium.com/@akgarg007/php-laravel-namespaces-and-traits-01-9540fe2969cb


1
Veuillez faire attention à créer des liens vers votre propre contenu sur différents sites, vous ne voulez pas être un spammeur . Vous devez inclure la majorité du contenu ici et utiliser le lien uniquement comme référence.
Dharman
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.