(PHP 5 >= 5.3.0, PHP 7, PHP 8)
En el marco de las reglas de resolución, hay varias definiciones importantes:
Esto es un identificador que no contiene un separador de espacio de nombres.
Por ejemplo: Foo
Esto es un identificador que contiene un separador de espacio de nombres.
Por ejemplo: Foo\Bar
Esto es un identificador que comienza con un separador de espacio de nombres.
Por ejemplo: \Foo\Bar. El espacio de nombres Foo
también es un nombre absoluto.
Esto es un identificador que comienza con namespace, como
namespace\Foo\Bar.
Los nombres se resuelven siguiendo las siguientes reglas:
\A\B se traduce por A\B.
namespace reemplazado por el namespace actual.
Si el nombre aparece en el namespace global, el prefijo
namespace\ se elimina. Por ejemplo namespace\A
en el namespace X\Y se traduce por X\Y\A.
El mismo nombre en el namespace global se traduce por A.
A\B\C se importa como C, el nombre C\D\E se traduce por A\B\C\D\E.
C\D\E en el namespace A\B,
se traduce por A\B\C\D\E.
use A\B\C; un uso como new C() corresponde al nombre
A\B\C(). De la misma manera, después use function A\B\foo; un uso
como foo() corresponde al nombre A\B\foo.
new C() en el namespace
A\B corresponde al nombre A\B\C.
A\B, aquí es cómo se resuelve una llamada a la función foo():
A\B\foo().
foo().
Ejemplo #1 Ejemplos de resolución de espacios de nombres
<?php
namespace A;
use B\D, C\E as F;
// llamadas a funciones
foo(); // primero se intenta llamar a "foo" definida en el espacio de nombres "A"
// después se llama a la función global "foo"
\foo(); // se llama a la función "foo" definidia en el ámbito global
mi\foo(); // se llama a la función "foo" definida en el espacio de nombres "A\mi"
F(); // primero se intenta llamar a "F" definida en el espacio de nombres "A"
// después se llama a la función global "F"
// referecias a clases
new B(); // crea un objeto de la clase "B" definida en el espacio de nombres "A"
// si no se encuentra, se intenta autocargar la clase "A\B"
new D(); // usando las reglas de importación, se crea un objeto de la clase "D" definida en el espacio de nombres "B"
// si no se encuentra, se intenta autocargar la clase "B\D"
new F(); // usando las reglas de importación, se crea un objeto de la clase "E" definida en el espacio de nombres "C"
// si no se encuentra, se intenta autocargar la clase "C\E"
new \B(); // crea un objeto de la clase "B" definida en el ámbito global
// si no se encuentra, se intenta autocargar la clase "B"
new \D(); // crea un objeto de la clase "D" definida en el ámbito global
// si no se encuentra, se intenta autocargar la clase "D"
new \F(); // crea un objeto de la clase "F" definida en el ámbito global
// si no se encuentra, se intenta autocargar la clase "F"
// métodos estáticos y funciones de un espacio de nombres desde otro espacio de nombres
B\foo(); // se llama a la función "foo" desde el espacio de nombres "A\B"
B::foo(); // se llama al método "foo" de la clase "B" definidia en el espacio de nombres "A"
// si no se encuentra la clase "A\B", se intenta autocargar la clase "A\B"
D::foo(); // usando las reglas de importación, se llama al método "foo" de la clase "D" definida en el espacio de nombres "B"
// si no se encuentra la clase "B\D", se intenta autocargar la clase "B\D"
\B\foo(); // se llama a la función "foo" desde el espacio de nombres "B"
\B::foo(); // se llama al método "foo" de la clase "B" desde el ámbito global
// si no es encuentra la clase "B", se intenta autocargar la clase "B"
// métodos estáticos y funciones de espacio de nombres del espacio actual
A\B::foo(); // llama al método "foo" de la clase "B" del espacio de nombres "A\A"
// si la clase "A\A\B" no se encuentra, intenta la carga automática en la clase "A\A\B"
\A\B::foo(); // llama al método "foo" de la clase "B" del espacio de nombres "A"
// si la clase "A\B" no se encuentra, intenta la carga automática en la clase "A\B"
?>