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
?>

add a note add a note

User Contributed Notes 3 notes

up
91
a dot schaffhirt at sedna-soft dot de
14 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(); // instantiates \foo\Xyz
new namespace\Xyz(); // instantiates \bar\Xyz
abc(); // invokes \bar\abc regardless of the second use statement
\foo\abc(); // it has to be invoked using the fully qualified name
?>

Hope, this can save someone from some trouble.

Best regards.
up
1
bharatthapa45 at gmail dot com
2 years ago
Difference between __NAMESPACE__ and keyword 'namespace' that I find relevant is when invoking a class:

<?php
namespace MyApp;

class
App {
    static function
app(){
        echo
'hello app';
    }
}

// this will work:
$obj = new namespace\App::app();

// this will not work
$obj = new __NAMESPACE__\App::app();

// however this will work:
$obj = __NAMESPACE__ . '\App';
$obj::foo();

?>
up
-19
cornichonche at gmail dot com
6 years ago
The example 4 is wrong.
Using php 7.2

<?php
namespace monProjet;

use function
blah\blah as mine;

blah\mine(); // Will NOT work
mine(); // Will work
?>
To Top