(PHP 5 >= 5.3.0, PHP 7, PHP 8)
Antes de hablar del uso de los espacios de nombres es importante entender cómo sabe PHP qué elemento del código del espacio de nombres se requiere. Se puede hacer una simple analogía entre los espacios de nombres de PHP y el sistema de ficheros. Existen tres maneras de acceder a un fichero en el sistema de ficheros:
foo.txt
. Se resuelve con
directorio_actual/foo.txt
donde directorio_actual es el
directorio actualmente ocupado. Así, si el directorio actual es
/home/foo
, el nombre se resuelve con /home/foo/foo.txt
.
subdirectorio/foo.txt
. Se resuelve
con directorioactual/subdirectorio/foo.txt
.
/main/foo.txt
. Se resuelve
con /main/foo.txt
.
$a = new foo();
o
foo::método_estático();
. Si el espacio de nombres actual es
espacio_de_nombres_actual
, esto se resuelve con
espacio_de_nombres_actual\foo
. Si
el código es global, es decir, no es de espacio de nombres, esto se resuelve con foo
.
Una advertencia: los nombres no cualificados para funciones y constantes se
resolverán con funciones y constantes globales si la función o la constante del espacio de nombres
no está definida. Véase Utilizar espacios de nombres:
una alternativa a funciones/constantes globales para más detalles.
$a = new subespacio_de_nombres\foo();
o
subespacio_de_nombres\foo::método_estático();
. Si el espacio de nombres actual es
espacio_de_nombres_actual
, esto se resuelve con
espacio_de_nombres_actual\subespacio_de_nombres\foo
. Si el código es global,
es decir, no es de espacio de nombres, esto se resuelve con subespacio_de_nombres\foo
.
$a = new \espacio_de_nombres_actual\foo();
o
\espacio_de_nombres_actual\foo::método_estático();
. Esto siempre se resuelve
con nombre literal especificado en el código, espacio_de_nombres_actual\foo
.
Un ejemplo de los tres tipos de sintaxis en código real:
fichero1.php
<?php
namespace Foo\Bar\subespacio_de_nombres;
const FOO = 1;
function foo() {}
class foo
{
static function método_estático() {}
}
?>
fichero2.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
?>
Observe que para acceder a cualquier clase,
función o constante globales, se puede utilizar un nombre completamente cualificado, como
\strlen() o \Exception o
\INI_ALL
.
Ejemplo #1 Acceder a 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
?>