## La palabra reservada namespace y la constante __NAMESPACE__

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

PHP admite dos formas de acceder de manera abstracta a elementos dentro del espacio de nombres actual: la constante mágica `__NAMESPACE__`, y la palabra reservada `namespace`.

El valor de `__NAMESPACE__` es una cadena que contiene el nombre del espacio de nombres actual. En código global, que no es de espacio de nombres, contiene una cadena vacía.

Ejemplo #1 Ejemplo de __NAMESPACE__, código de espacio de nombres

`<?php
namespace MiProyecto;
echo '"', __NAMESPACE__, '"'; // imprime "MiProyecto"
?>`

Ejemplo #2 Ejemplo de __NAMESPACE__, código global

`<?php
echo '"', __NAMESPACE__, '"'; // imprime ""
?>`
La constante `__NAMESPACE__` es útil para construir nombres dinámicamente, por ejemplo:

Ejemplo #3 Empleo de __NAMESPACE__ para la construcción dinámica de nombres

`<?php
namespace MiProyecto;
function obtener($nombre_clase)
{
$a = __NAMESPACE__ . '\\' . $nombre_clase;
return new $a;
}
?>`

La palabra reservada `namespace` se puede utilizar para solicitar explícitamente un elemento del espacio de nombres o subespacio de nombres actual. Es el equivalente del espacio de nombres para el operador `self` de las clases.

Ejemplo #4 El operador namespace, dentro de un espacio de nombres

`<?php
namespace MiProyecto;
use blah\blah as mío; // véase "Uso de los espacios de nombres: Apodar/Importar"
blah\mío(); // llama a la función MiProyecto\blah\mío()
namespace\blah\mío(); // llama a la función MiProyecto\blah\mío()
namespace\func(); // llama a la función MiProyecto\func()
namespace\sub\func(); // llama a la función MiProyecto\sub\func()
namespace\nombrec::método(); // llama al método estático "método" de la clase MiProyecto\nombrec
$a = new namespace\sub\nombrec(); // instancia un objeto de la clase MiProyecto\sub\nombrec
$b = namespace\CONSTANTE; // asigna el valor de la constante MiProyecto\CONSTANTE a $b
?>`

Ejemplo #5 El operador namespace, en código global

`<?php
namespace\func(); // llama a la función func()
namespace\sub\func(); // llama a la función sub\func()
namespace\nombrec::método(); // llama al método estático "método" de la clase nombrec
$a = new namespace\sub\nombrec(); // instancia un objeto de la clase sub\nombrec
$b = namespace\CONSTANTE; // asigna el valor de la constante CONSTANTE a $b
?>`