(PHP 5 >= 5.3.0, PHP 7, PHP 8)
Antes de discutir el uso de los espacios de nombres, es importante comprender cómo PHP deduce qué espacio de nombres utiliza su código. Se puede hacer una analogía simple entre los espacios de nombres de PHP y un sistema de ficheros. Hay tres maneras de acceder a un fichero en un sistema de ficheros:
foo.txt
. Esto se resuelve
en directoriocorriente/foo.txt
donde directoriocorriente
es el
directorio de trabajo. Si el directorio actual es /home/foo
,
este nombre se resuelve en /home/foo/foo.txt
.
subdirectorio/foo.txt
. Esto se
resuelve en directoriocorriente/subdirectorio/foo.txt
.
/main/foo.txt
. Esto se resuelve
en /main/foo.txt
.
$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 calificativo para las funciones y las
constantes se tomarán del espacio de nombres global, si la función
no está definida en el espacio de nombres actual. Véase
Uso de los espacios de nombres:
retorno al espacio de nombres global para las funciones y las constantes para
más detalles.
$a = new subespacedenoms\foo();
o
subespacedenoms\foo::methodestatique();
. Si el espacio de nombres actual
es espacedenomscourant
, esto se convierte
en espacedenomscourant\subespacedenoms\foo
. Si
el código es global, es decir, el espacio de nombres sin nombre,
esto se convierte en subespacedenoms\foo
.
$a = new \espacedenomscourant\foo();
o
\espacedenomscourant\foo::methodestatique();
. Esto siempre
hace referencia al nombre literal especificado en el código: espacedenomscourant\foo
.
A continuación se muestra un ejemplo de las tres sintaxis, en código real:
file1.php
<?php
namespace Foo\Bar\subespacio_de_nombres;
const FOO = 1;
function foo() {}
class foo
{
static function método_estático() {}
}
?>
file2.php
<?php
namespace Foo\Bar;
include 'fichero1.php';
const FOO = 2;
function foo() {}
class foo
{
static function método_estático() {}
}
/* Nombre no cualificado */
foo(); // se resuelve con la función Foo\Bar\foo
foo::método_estático(); // se resuelve con la clase Foo\Bar\foo, método método_estático
echo FOO; // se resuelve con la constante Foo\Bar\FOO
/* Nombre cualificado */
subespacio_de_nombres\foo(); // se resuelve con la función Foo\Bar\subespacio_de_nombres\foo
subespacio_de_nombres\foo::método_estático(); // se resuelve con la clase Foo\Bar\subespacio_de_nombres\foo,
// método método_estático
echo subespacio_de_nombres\FOO; // se resuelve con la constante Foo\Bar\subespacio_de_nombres\FOO
/* Nombre conmpletamente cualificado */
\Foo\Bar\foo(); // se resuelve con la función Foo\Bar\foo
\Foo\Bar\foo::método_estático(); // se resuelve con la clase Foo\Bar\foo, método método_estático
echo \Foo\Bar\FOO; // se resuelve con la constante Foo\Bar\FOO
?>
Tenga en cuenta que para acceder a cualquier clase, función o constante
global, se puede utilizar un nombre absoluto, como
\strlen() o \Exception o
\INI_ALL
.
Ejemplo #1 Acceso a las clases, funciones y constantes globales desde un espacio de nombres
<?php
namespace Foo;
function strlen() {}
const INI_ALL = 3;
class Exception {}
$a = \strlen('hola'); // llama a la función global strlen
$b = \INI_ALL; // accede a la constante global INI_ALL
$c = new \Exception('error'); // instancia a la clase global Exception
?>