Aide-mémoire : Les espaces de noms PHP
Posté le Tuesday 2 October 2012 | Catégories : PHP
Les espaces de noms, arrivés avec PHP 5.3, sont grosso-modo l'équivalent des packages de Java.
Définition d'un espace de noms
Un espace de noms a pour but de contenir des classes, des interfaces, des fonctions et des constantes. Voici par exemple le fichier dframework.php:
// La déclaration du namespace doit être la première ligne du fichier
// Les tirets sont interdits
namespace web_d\dframework;
class MaClasse {}
// Il est possible de redéfinir une fonction PHP
function strlen($string) {
return 0;
}
const MACONSTANTE = 1;
// L'espace de noms peut également contenir d'autres instructions,
// mais à priori ce n'est pas le but
echo "Hello";
Utilisation
L'utilisation de cet espace de noms est possible depuis l'espace de noms "global", lorsqu'aucun namespace n'est indiqué, comme ci-dessous:
require_once "./dframework.php";
$a = new \web_d\dframework\MaClasse;
Importation
Pour éviter de chaque fois indiquer le nom complet de la classe, fonction ou constante, on peut importer un espace de noms:
// Contrairement à Java, ceci est impossible:
// use web_d\dframework\*
// $b = new MaClasse
// Il faut soit préciser le nom de l'espace de noms:
use \web_d\dframework;
$b = new dframework\MaClasse;
// Ou alors importer chaque classe ou fonction une par une
use \web_d\dframework\MaClasse;
$c = new MaClasse;
// En cas d'import, c'est d'abord la fonction globale qui est utilisée.
use \web_d\dframework\strlen;
echo strlen('bonjour'); // 7
// En cas de conflit, on peut créer un alias, mais ceci ne fonctionne que pour
// les classes, les interfaces, ou un espace de noms en entier:
use web_d\dframework\MaClasse as MaClasse2;
new MaClasse2;
A l'intérieur du même espace de noms
// Une autre façon de définir l'espace de noms
namespace web_d\dframework {
// A l'intérieur du même espace de noms,
// c'est d'abord la définition locale qui est utilisée
echo strlen("bonjour"); // 0
// Pour utiliser quand même la fonction globale:
echo \strlen("bonjour"); // 7
// Idem pour les classes et les constantes:
$c = new \Exception('error');
// namespace indique de chercher dans l'espace de nom local
// les 2 instrcutions sont donc équivalentes
$d = \web_d\dframework\MACONSTANTE;
$d = namespace\MACONSTANTE;
// Ceci n'est pas correct!
//echo namespace;
// Pour obtenir le nom de l'espace de nom sous forme d'un texte,
// il existe la constante __NAMESPACE__
}
Langage dynamique
namespace web_d\dframework {
// PHP étant un langage dynamique, il est possible de définir le
// nom de classe, fonction ou constante à l'exécution:
$class_name = __NAMESPACE__ . '\MaClasse';
$e = new $class_name;
$const_name = __NAMESPACE__ . '\MACONSTANTE';
echo constant($const_name);
}