(PHP 5 >= 5.3.0, PHP 7, PHP 8)
Antes de discutir el uso de espacios de nombres, es importante comprender cómo PHP deduce qué espacio de nombres está utilizando su código. Puede hacerse una analogía simple entre los espacios de nombres de PHP y un sistema de archivos. Hay tres formas de acceder a un archivo en un sistema de archivos:
Un nombre de archivo relativo, como foo.txt. Esto se resuelve
en dossiercourant/foo.txt donde dossiercourant es el
directorio de trabajo. Si el directorio actual es /home/foo,
este nombre se resuelve en /home/foo/foo.txt.
Una ruta relativa, como sub-dossier/foo.txt. Esto se
resuelve en dossiercourant/sub-dossier/foo.txt.
Una ruta absoluta, como /main/foo.txt. Esto se resuelve
en /main/foo.txt.
Un nombre sin calificador, o una clase sin prefijo, como
$a = new foo(); o
foo::methodestatique();. Si el espacio de nombres actual
es espacedenomscourant, esto se resuelve en
espacedenomscourant\foo. Si el espacio de nombres es
global, es decir, el espacio de nombres sin nombre, esto se convierte en foo.
Una advertencia: los nombres sin calificador para funciones y constantes se tomarán del espacio de nombres global, si la función no está definida en el espacio de nombres actual. Ver Uso de espacios de nombres: retorno al espacio de nombres global para funciones y constantes para más detalles.
Un nombre calificado, o una clase con prefijo como
$a = new sousespacedenoms\foo(); o
sousespacedenoms\foo::methodestatique();. Si el espacio de nombres actual
es espacedenomscourant, esto se convierte
en espacedenomscourant\sousespacedenoms\foo. Si
el código es global, es decir, el espacio de nombres sin nombre,
esto se convierte en sousespacedenoms\foo.
Un nombre absoluto, o un nombre con prefijo con un operador global como
$a = new \espacedenomscourant\foo(); o
\espacedenomscourant\foo::methodestatique();. Esto siempre
hace referencia al nombre literal especificado en el código: espacedenomscourant\foo.
Aquí hay un ejemplo de las tres sintaxis, en código real:
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() {}
}
/* nombre no calificado */
foo(); // Se convierte en Foo\Bar\foo
foo::methodestatique(); // Se convierte en Foo\Bar\foo, método methodestatique
echo FOO; // Se convierte en la constante Foo\Bar\FOO
/* nombre calificado */
sousespacedenoms\foo(); // Se convierte en la función Foo\Bar\sousespacedenoms\foo
sousespacedenoms\foo::methodestatique(); // se convierte en la clase Foo\Bar\sousespacedenoms\foo,
// método methodestatique
echo sousespacedenoms\FOO; // Se convierte en la constante Foo\Bar\sousespacedenoms\FOO
/* nombre absoluto */
\Foo\Bar\foo(); // Se convierte en la función Foo\Bar\foo
\Foo\Bar\foo::methodestatique(); // Se convierte en la clase Foo\Bar\foo, método methodestatique
echo \Foo\Bar\FOO; // Se convierte en la constante Foo\Bar\FOO
Tenga en cuenta que para acceder a cualquier clase, función o constante
global, puede utilizarse un nombre absoluto, como
\strlen() o \Exception o
\INI_ALL.
Ejemplo #1 Acceso a clases, funciones y constantes globales desde un espacio de nombres
<?php
namespace Foo;
function strlen() {}
const INI_ALL = 3;
class Exception {}
print \strlen('hi') . "\n"; // llama a la función global strlen
print \INI_ALL . "\n"; // acceso a una constante INI_ALL
$c = new \Exception('error'); // instancia la clase global Exception
print $c::class . "\n";