(PHP 5 >= 5.3.0, PHP 7, PHP 8)
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 :
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
.
sous-dossier/foo.txt
. Cela se
résout en dossiercourant/sous-dossier/foo.txt
.
/main/foo.txt
. Cela se résout
en /main/foo.txt
.
$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.
$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
.
$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\foo
foo::methodestatique(); // Devient Foo\Bar\foo, méthode methodestatique
echo FOO; // Devient la constante Foo\Bar\FOO
/* nom qualifié */
sousespacedenoms\foo(); // Devient la fonction Foo\Bar\sousespacedenoms\foo
sousespacedenoms\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 methodestatique
echo \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
.
Exemple #1 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; // accès à une constante INI_ALL
$c = new \Exception('error'); // instantie la classe globale Exception
?>