Recherche…


Remarques

De la documentation PHP :

Que sont les espaces de noms? Dans les définitions les plus larges, les espaces de noms sont un moyen d'encapsuler des éléments. Cela peut être considéré comme un concept abstrait dans de nombreux endroits. Par exemple, dans tout système d'exploitation, les répertoires servent à regrouper les fichiers associés et à servir d'espace de noms 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, nous devons ajouter le nom du répertoire au nom du fichier en utilisant le 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.

Notez que les espaces de noms de niveau supérieur PHP et php sont réservés au langage PHP lui-même. Ils ne doivent être utilisés dans aucun code personnalisé.

Déclaration des espaces de noms

Une déclaration d'espace de noms peut ressembler à ceci:

  • namespace MyProject; - Déclarez l'espace de noms MyProject
  • namespace MyProject\Security\Cryptography; - Déclarez un espace de noms imbriqué
  • namespace MyProject { ... } - Déclarez un espace de noms avec des crochets.

Il est recommandé de ne déclarer qu'un seul espace de noms par fichier, même si vous pouvez en déclarer autant que vous le souhaitez dans un seul fichier:

namespace First {
    class A { ... }; // Define class A in the namespace First.
}

namespace Second {
    class B { ... }; // Define class B in the namespace Second.
}

namespace {
    class C { ... }; // Define class C in the root namespace.
}

Chaque fois que vous déclarez un espace de noms, les classes que vous définissez après cela appartiendront à cet espace de noms:

namespace MyProject\Shapes;

class Rectangle { ... }
class Square { ... }
class Circle { ... }

Une déclaration d'espace de noms peut être utilisée plusieurs fois dans des fichiers différents. L'exemple ci-dessus a défini trois classes dans l'espace de noms MyProject\Shapes dans un seul fichier. De préférence, ceci serait divisé en trois fichiers, chacun commençant par l' namespace MyProject\Shapes; de namespace MyProject\Shapes; . Ceci est expliqué plus en détail dans l'exemple standard PSR-4.

Référencement d'une classe ou d'une fonction dans un espace de noms

Comme indiqué dans Déclarer les espaces de noms , nous pouvons définir une classe dans un espace de noms comme suit:

namespace MyProject\Shapes;

class Rectangle { ... }

Pour référencer cette classe, le chemin complet (y compris l'espace de noms) doit être utilisé:

$rectangle = new MyProject\Shapes\Rectangle();

Cela peut être raccourci en important la classe via l' use -Déclaration:

// Rectangle becomes an alias to MyProject\Shapes\Rectangle
use MyProject\Shapes\Rectangle;

$rectangle = new Rectangle();

En ce qui concerne PHP 7.0, vous pouvez regrouper diverses déclarations d’ use en une seule instruction entre parenthèses:

use MyProject\Shapes\{
    Rectangle,         //Same as `use MyProject\Shapes\Rectangle`
    Circle,            //Same as `use MyProject\Shapes\Circle`
    Triangle,          //Same as `use MyProject\Shapes\Triangle`
    
    Polygon\FiveSides, //You can also import sub-namespaces
    Polygon\SixSides   //In a grouped `use`-statement
};

$rectangle = new Rectangle();

Parfois, deux classes ont le même nom. Ce n'est pas un problème si elles sont dans un autre espace de noms, mais il pourrait devenir un problème lors d'une tentative de les importer à l' use -Déclaration:

use MyProject\Shapes\Oval;
use MyProject\Languages\Oval; // Apparantly Oval is also a language!
// Error!

Ceci peut être résolu en définissant un nom pour l'alias vous en utilisant le as mot clé:

use MyProject\Shapes\Oval as OvalShape;
use MyProject\Languages\Oval as OvalLanguage;

Pour référencer une classe en dehors de l'espace de noms actuel, il doit être échappé avec un \ , sinon un chemin d'accès relatif à l'espace de noms est pris dans l'espace de noms actuel:

namespace MyProject\Shapes;

// References MyProject\Shapes\Rectangle. Correct!
$a = new Rectangle();

// References MyProject\Shapes\Rectangle. Correct, but unneeded!
$a = new \MyProject\Shapes\Rectangle(); 

// References MyProject\Shapes\MyProject\Shapes\Rectangle. Incorrect!
$a = new MyProject\Shapes\Rectangle(); 


// Referencing StdClass from within a namespace requires a \ prefix
// since it is not defined in a namespace, meaning it is global.

// References StdClass. Correct!
$a = new \StdClass(); 

// References MyProject\Shapes\StdClass. Incorrect!
$a = new StdClass(); 

Que sont les espaces de noms?

La communauté PHP a beaucoup de développeurs qui créent beaucoup de code. Cela signifie que le code PHP d'une bibliothèque peut utiliser le même nom de classe qu'une autre bibliothèque. Lorsque les deux bibliothèques sont utilisées dans le même espace de noms, elles se heurtent et causent des problèmes.

Les espaces de noms résolvent ce problème. Comme décrit dans le manuel de référence PHP, les espaces de noms peuvent être comparés aux répertoires du système d'exploitation que les fichiers d'espace de noms; deux fichiers portant le même nom peuvent coexister dans des répertoires distincts. De même, deux classes PHP portant le même nom peuvent coexister dans des espaces de noms PHP distincts.

Il est important pour vous de nommer votre code afin qu'il puisse être utilisé par d'autres développeurs sans crainte de se heurter à d'autres bibliothèques.

Déclaration des sous-espaces de noms

Pour déclarer un seul espace de noms avec une hiérarchie, utilisez l'exemple suivant:

namespace MyProject\Sub\Level;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }

L'exemple ci-dessus crée:

constant MyProject\Sub\Level\CONNECT_OK

classe MyProject\Sub\Level\Connection et

function MyProject\Sub\Level\connect



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow