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
?>
a dot schaffhirt at sedna-soft dot de ¶15 years ago
Just in case you wonder what the practical use of the namespace keyword is...
It can explicitly refer to classes from the current namespace regardless of possibly "use"d classes with the same name from other namespaces. However, this does not apply for functions.
Example:
<?php
namespace foo;
class Xyz {}
function abc () {}
?>
<?php
namespace bar;
class Xyz {}
function abc () {}
?>
<?php
namespace bar;
use foo\Xyz;
use foo\abc;
new Xyz(); new namespace\Xyz(); abc(); \foo\abc(); ?>
Hope, this can save someone from some trouble.
Best regards.
bharatthapa45 at gmail dot com ¶3 years ago
Difference between __NAMESPACE__ and keyword 'namespace' that I find relevant is when invoking a class:<?phpnamespace MyApp;class App { static function app(){ echo 'hello app'; }}$obj = new namespace\App::app();$obj = new __NAMESPACE__\App::app();$obj = __NAMESPACE__ . '\App';$obj::foo();?>