php[world] in Washington, D.C.

La palabra clave namespace y la constante __NAMESPACE__

(PHP 5 >= 5.3.0)

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

El valor de __NAMESPACE__ es una cadena que contiene el nombre del espacio de nombres actual. En código global, código 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 usar __NAMESPACE__ para la construcción dinámica de nombres

<?php
namespace MiProyecto;

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

La palabra clave namespace se puede usar para solicitar explícitamente un elemento del espacio de nombres o subespacio de nombres actual. Es el espacio de nombres equivalente al 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 "Usar 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 1 note

up
15
a dot schaffhirt at sedna-soft dot de
4 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
?>

(Sorry, I had to use "|" instead of "\", as it was always discarded in the preview, except within a comment.)

Hope, this can save someone from some trouble.

Best regards.
To Top