Vous êtes ici :
Accueil Tutoriel Programmations Introduction aux espaces de noms en langage PHP

Introduction aux espaces de noms en langage PHP

Quand vous commencez le developpement des grosses applications parfois vous confondez les noms des variables,fonctions,constantes et autres

Que sont les espaces de noms ?

Dans leur définition la plus large, ils représentent un moyen d'encapsuler des éléments. Cela peut être conçu comme un concept abstrait, à différents endroits. Par exemple, dans un système de fichiers, les dossiers représentent un groupe de fichiers associés et servent d'espace de noms pour les fichiers qu'ils contiennent. Un exemple concret est que le fichier foo.txt peut exister dans les deux dossiers /home/greg et /home/other, mais que les deux copies de foo.txt ne peuvent pas co-exister dans le même dossier. De plus, pour accéder au fichier foo.txt depuis l'extérieur du dossier /home/greg, il faut préciser le nom du dossier en utilisant un séparateur de dossier, tel que /home/greg/foo.txt. Le même principe s'applique aux espaces de noms dans le monde de la programmation.

Dans le monde PHP, les espaces de noms sont conçus pour résoudre deux problèmes que rencontrent les auteurs de bibliothèques et d'applications lors de la réutilisation d'éléments tels que des classes ou des bibliothèques de fonctions :

  1. Collisions de noms entre le code que vous créez, les classes, fonctions ou constantes internes de PHP, ou celle de bibliothèques tierces.
  2. La capacité de faire des alias ou de raccourcir des Noms_Extremement_Long pour aider à la résolution du premier problème, et améliorer la lisibilité du code.

Les espaces de noms PHP fournissent un moyen pour regrouper des classes, interfaces, fonctions ou constantes. Voici un exemple de syntaxe des espaces de noms PHP :

Exemple de syntaxe des espaces de noms:

<?php
namespace mon\nom;
class MaClasse {}
function mafonction() {}
const MACONSTANTE = 1;
$a = new MaClasse;
$c = new \mon\nom\MaClasse;
$a = strlen('bonjour');
$d = namespace\MACONSTANTE;
$d = __NAMESPACE__ . '\MACONSTANTE';
echo constant($d); 
?> 

Note:

Les espaces de noms PHP et php, mais aussi les noms composés commençant par ces noms (comme PHP\Classes) sont réservés pour l'utilisation interne du langage, et ne doivent pas être utilisés dans le code de l'espace utilisateur.

Définition des espaces de noms

Bien que du code PHP valide puisse être contenu dans un espace de noms, seuls les types de code suivants peuvent être affectés par les espaces de noms : les classes (incluants les abstraites et les traits), les interfaces, les fonctions et les constantes.

Les espaces de noms sont déclarés avec le mot-clé namespace. Un fichier contenant un espace de noms doit déclarer l'espace au début du fichier, avant tout autre code, avec une seule exception : le mot clé declare.

Déclaration d'un espace de noms:

<?php
namespace MonProjet;
const CONNEXION_OK = 1;
class Connexion { /* ... */ }
function connecte() { /* ... */ }
?> 

 

Le seul élément autorisé avant la déclaration d'espace de noms est la commande declare, pour définir l'encodage du fichier source. De plus, aucun code non-PHP ne peut précéder la déclaration d'espace de noms, y compris des espaces :

Erreur de déclaration d'un espace de noms:

<html>
<?php
namespace MonProjet; // erreur fatale : l'espace de noms doit être le premier élément du script
?> 

 

De plus, contrairement à d'autres structures PHP, le même espace de noms peut être défini dans plusieurs fichiers, ce qui permet de scinder le contenu d'un espace de noms sur plusieurs fichiers.

Déclaration d'un sous espace de noms

Comme pour les fichiers et les dossiers, les espaces de noms sont aussi capables de spécifier une hiérarchie d'espaces de noms. Ainsi, un nom d'espace de noms peut être défini avec ses sous-niveaux :

<?php
namespace MonProjet\Sous\Niveau;
const CONNEXION_OK = 1;
class Connexion { /* ... */ }
function connecte() { /* ... */ }
?> 

 

Dans l'exemple ci-dessus, la constante MonProjet\Sous\Niveau\CONNEXION_OK, la classe MonProjet\Sous\Niveau\Connexion et la fonction MonProjet\Sous\Niveau\connecte sont créées.

Définition de plusieurs espaces de noms dans le même fichier

Plusieurs espaces de noms peuvent aussi être déclarés dans le même fichier. Il y a deux syntaxes autorisées.

Déclaration de plusieurs espaces de noms, syntaxe à combinaison simple:

<?php
namespace MonProjet;
const CONNEXION_OK = 1;
class Connexion { /* ... */ }
function connecte() { /* ... */ }
namespace AutreProjet;
const CONNEXION_OK = 1;
class Connexion { /* ... */ }
function connecte() { /* ... */ }
?> 

 

Cette syntaxe n'est pas recommandée pour combiner des espaces de noms dans un seul fichier. Au lieu de cela, il est recommandé d'utiliser la syntaxe à accolades.

Déclaration de plusieurs espaces de noms, syntaxe à accolades:

<?php
namespace MonProjet {
const CONNEXION_OK = 1;
class Connexion { /* ... */ }
function connecte() { /* ... */ }
}
namespace AutreProjet {
const CONNEXION_OK = 1;
class Connexion { /* ... */ }
function connecte() { /* ... */ }
}
?>

Il est fortement recommandé, en tant que pratique de codage, de ne pas mélanger plusieurs espaces de noms dans le même fichier. L'utilisation recommandée est de combiner plusieurs scripts PHP dans le même fichier.

Pour combiner plusieurs codes sans espaces de noms dans du code avec espace de noms, seule la syntaxe à accolades est supportée. Le code global doit être encadré par un espace de noms sans nom, tel que celui-ci :

Déclaration de plusieurs espaces de noms avec un espace sans nom:

<?php
namespace MonProjet {
const CONNEXION_OK = 1;
class Connexion { /* ... */ }
function connecte() { /* ... */ }
}
namespace { 
// code global 
session_start();
$a = MonProjet\connecte();
echo MonProjet\Connexion::start();
}
?> 

 

Aucun code PHP ne peut exister hors des accolades de l'espace de noms, sauf pour ouvrir une nouvelle instruction declare

Déclaration de plusieurs espaces de noms avec un espace sans nom (2)

<?php
declare(encoding='UTF-8');
namespace MonProjet {
const CONNEXION_OK = 1;
class Connexion { /* ... */ }
function connecte() { /* ... */ }
}
namespace { 
// code global
session_start();
$a = MonProjet\connecte();
echo MonProjet\Connexion::start();
}
?> 

 

Utilisation des espaces de noms

Avant de discuter de l'utilisation des espaces de noms, il est important de comprendre comment PHP devine quel espace de noms votre code utilise. Une analogie simple peut être faite entre les espaces de noms de PHP et un système de fichiers. Il y a trois moyens d'accéder à un fichier dans un système de fichiers :

  1. Un nom relatif de fichier, tel que foo.txt. Cela est résolu en dossiercourant/foo.txt où dossiercourant est le dossier de travail. Si le dossier courant est /home/foo, ce nom se résout en /home/foo/foo.txt.
  2. Un chemin relatif, tel que sous-dossier/foo.txt. Cela se résout en dossiercourant/sous-dossier/foo.txt.
  3. Un chemin absolu, tel que /main/foo.txt. Cela se résout en /main/foo.txt.

Le même principe peut être appliqué aux espaces de noms de PHP. Par exemple, on peut faire référence à une classe de trois manières :

  1. Un nom sans qualificatif, ou une classe sans préfixe, telle que $a = new foo(); ou foo::methodestatique();. Si l'espace de noms courant est espacedenomscourant, ceci se résout en espacedenomscourant\\foo. Si l'espace de noms est global, soit encore l'espace de noms sans nom, cela devient foo. Une mise en garde : les noms sans qualificatif pour les fonctions et les constantes vont être pris dans l'espace de noms global, si la fonction n'est pas définie dans l'espace de noms courant. Voyez Utilisation des espaces de noms : retour à l'espace de noms global pour les fonctions et les constantes pour plus de détails.
  2. Un nom qualifié, ou une classe préfixée telle que $a = new sousespacedenoms\foo(); ou sousespacedenoms\foo::methodestatique();. Si l'espace de noms courant est espacedenomscourant, cela devient espacedenomscourant\sousespacedenoms\foo. Si le code est global, c'est à dire l'espace de noms sans nom, cela devient sousespacedenoms\foo.
  3. Un nom absolu, ou un nom préfixé avec un opérateur global tel que $a = new \espacedenomscourant\foo(); ou \espacedenomscourant\foo::methodestatique();. Cela fait toujours référence au nom littéral spécifié dans le code : espacedenomscourant\foo.

Voici un exemple des trois syntaxes, dans du code réel :

file1.php:

<?php
namespace Foo\Bar\sousespacedenoms;
const FOO = 1;
function foo() {}
class foo{ 
static function methodestatique() {}
}
?> 

 

file2.php:

<?php
namespace Foo\Bar;
include 'file1.php';
const FOO = 2;
function foo() {}
class foo{ 
static function methodestatique() {}
}
/* nom non qualifié */
foo(); 
// Devient Foo\Bar\foofoo::methodestatique(); 
// Devient Foo\Bar\foo, méthode methodestatiqueecho FOO; 
// Devient la constante Foo\Bar\FOO
/* nom qualifié */
sousespacedenoms\foo(); 
// Devient la fonction Foo\Bar\sousespacedenoms\foosousespacedenoms\foo::methodestatique(); 
// devient la classe Foo\Bar\sousespacedenoms\foo,
 // méthode methodestatique
echo sousespacedenoms\FOO; 
// Devient la constante Foo\Bar\sousespacedenoms\FOO 
 /* nom absolu */
\Foo\Bar\foo(); 
// Devient la fonction 
Foo\Bar\foo\Foo\Bar\foo::methodestatique(); 
// Devient la classe Foo\Bar\foo, méthode methodestatiqueecho 
\Foo\Bar\FOO; 
// Devient la constante Foo\Bar\FOO
?> 

 

Notez que pour accéder à n'importe quelle classe, fonction ou constante globale, un nom absolu peut être utilisé, tel que \strlen() ou \Exception ou \INI_ALL

Accès aux classes, fonctions et constantes globales depuis un espace de noms:

<?php
namespace Foo;
function strlen() {}
const INI_ALL = 3;
class Exception {}
$a = \strlen('hi'); 
// appel la fonction globale strlen
$b = \INI_ALL; // acceder? une constante INI_ALL
$c = new \Exception('error'); 
// instantie la classe globale Exception

?> 

Voilà une coutre description des espaces de noms en langage PHP.

credit http://php.net




Tony NGUEREZA 23 Août 2015, 18h03

Aucun commentaire n'a encore été ajouté soyez le premier a ajouté un commentaire

Vous n'êtes pas connecter veuillez vous connecter ou créer gratuitement un compte pour poster des commentaires

Vous êtes ici :
Accueil Tutoriel Programmations Introduction aux espaces de noms en langage PHP