web-dev-qa-db-fra.com

Que sont les espaces de noms?

Que sont les espaces de noms PHP? 

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

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

193
Imran

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

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

Le scénario

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

Plus tard, votre application grossit 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 générer le dernier flux.

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

Exemple

Comment pouvons-nous résoudre en ayant deux fonctions output()? Simple. Nous collons chaque fonction output() dans son propre namespace .

Cela ressemblerait à 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 utiliserons:

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

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

namespace MyProject;

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

Aucun espace de noms?

Si nous n'avions pas d'espaces de noms, nous devrions (potentiellement) changer beaucoup de code à chaque fois que nous ajoutons une bibliothèque ou créer des préfixes fastidieux pour rendre nos noms de fonctions uniques. Avec les espaces de noms, nous pouvons éviter le risque de conflits de nommage lors du mélange de code tiers avec nos propres projets.

504
cbednarski

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.

Cela permet à votre code de live dans cet espace de noms.

PHP utilise le caractère plutôt controversé\ pour afficher les niveaux d'espace de noms. Les gens se sont levés dans les bras parce que c'est aussi utilisé comme un personnage de fuite.

Pour utiliser l’espace de nommage en PHP, utilisez quelque chose comme ceci en haut de votre fichier.

namespace my\namespace;

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

15
alex

Il existe des techniques telles que les espaces de noms dans d'autres langages de programmation (comme les packages en Java). Ils sont habitués à 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 constituent un moyen d'encapsuler des éléments. Cela peut être considéré 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 servent d’espace de nommage pour les fichiers qu’ils contiennent. Comme 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, vous devez ajouter le nom du répertoire au nom du fichier à l'aide du séparateur de répertoire afin d'obtenir /home/greg/foo.txt. Ce même principe s'étend aux espaces de noms dans le monde de la programmation.

9
2ndkauboy

Un espace de noms vous permet 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.

Celles-ci sont utiles lorsque vous travaillez avec des applications plus volumineuses pour éviter les problèmes liés aux morceaux de code partageant le même nom.

Par exemple, supposons que nous voulions deux fonctions appelées "TheMessage". Ces deux éléments 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 erreur.

2
Alexander

L'espace de noms est comme emballer beaucoup de choses dans un seul paquet. 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. Pour éviter d'utiliser les objets les uns des autres, vous décidez d'étiqueter les tiroirs de manière à ce qu'il soit facile de savoir qui appartient à qui.

1
Mamun Sabuj

Un espace de noms fonctionne comme un répertoire. Vous savez comment vous pouvez mettre des fichiers dans un répertoire avec les mêmes noms que les fichiers du répertoire parent (ou de 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 quelques temps, il y avait une tendance dans PHP pour les énormes classes de fonctions statiques. Le seul moyen d'appeler l'une de ces fonctions consiste à préfixer un appel avec le nom de la classe. C’était une tentative primitive d’espaces de nommage, mais avec peu d’avantages.

1
staticsan

Tout comme directory et files, l'espace de nom dans PHP sert à regrouper classes, functions, interfaces et constants.

Exemple:

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

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

Cependant, il existe certaines limites par analogie entre PHP espace de noms et système de fichiers 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 la programmation Word.

1
Kossi

Un espace de noms est un système simple permettant de contrôler les noms dans un programme.
Il s’assure que les noms sont uniques et n’entraînent aucun conflit.

0
humaid

Namespace est utilisé pour grouper des codes afin qu’ils puissent être utilisés à différents endroits sans conflit de nom .. Pensez-y comme une méthode jQuery sans conflit et vous la comprendrez mieux. 

0
Emmanuel David