PHP Conference Kansai 2025

El comando namespace y la constante __NAMESPACE__

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

PHP soporta 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 MiProyecto;

echo
'"', __NAMESPACE__, '"'; // imprime "MiProyecto"
?>

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 MiProyecto;

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

El comando namespace también puede ser utilizado 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 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 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\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

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