El comando namespace y la constante __NAMESPACE__

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

PHP admite dos medios para acceder de manera abstracta a los elementos en el espacio de nombres actual, a saber, la constante mágica __NAMESPACE__ y el comando namespace.

El valor de __NAMESPACE__ es una cadena que contiene el nombre del espacio de nombres actual. En el espacio global, sin nombre, contiene una cadena vacía.

Ejemplo #1 Ejemplo con __NAMESPACE__, en un código con espacio de nombres

<?php
namespace MonProjet;

echo
'"', __NAMESPACE__, '"'; // muestra "MonProjet"
?>

Ejemplo #2 Ejemplo con __NAMESPACE__, en un código con espacio de nombres global

<?php

echo '"', __NAMESPACE__, '"'; // muestra ""
?>
La constante __NAMESPACE__ es útil para construir dinámicamente nombres, como:

Ejemplo #3 Uso de __NAMESPACE__ para una construcción dinámica de nombres

<?php
namespace MonProjet;

function
get($classname)
{
$a = __NAMESPACE__ . '\\' . $classname;
return new
$a;
}
?>

El comando namespace también puede usarse para solicitar explícitamente un elemento del espacio de nombres actual, o de un subespacio. Es el equivalente para los espacios de nombres del operador self de las clases.

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

<?php
namespace MonProjet;

use
blah\blah as mine; // Ver "Uso de espacios de nombres: alias e importación"

blah\mine(); // llama a la función MonProjet\blah\mine()
namespace\blah\mine(); // llama a la función MonProjet\blah\mine()

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

Ejemplo #5 El operador namespace, en el espacio de nombres global

<?php

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

add a note

User Contributed Notes 2 notes

up
88
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(); // 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
0
bharatthapa45 at gmail dot com
3 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();

?>
To Top