(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() {}
}
foo(); // Devient Foo\Bar\foo
foo::methodestatique(); // Devient Foo\Bar\foo, méthode methodestatique
echo FOO; // Devient la constante Foo\Bar\FOO
sousespacedenoms\foo(); // Devient la fonction Foo\Bar\sousespacedenoms\foo
sousespacedenoms\foo::methodestatique(); // devient la classe Foo\Bar\sousespacedenoms\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
?>