(PHP 5 >= 5.3.0)
Aquí hay algunas definiciones importantes para los propósitos de estas reglas de resolución:
Es un identificador sin un separador de espacios de nombres, como Foo
Es un identificador con un separador de espacios de nombres, como Foo\Bar
Es un identificador con un separador de espacios de nombres que comienza con un separador de espacios de nombres, como \Foo\Bar. namespace\Foo también es un nombre completamente cualificado.
Los nombres se resuelven siguiendo estas reglas de resolución:
Ejemplo #1 Las resoluciones de nombres ilustradas
<?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/funciones de 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/funciones de espacio de nombres del espacio de nombres actual
A\B::foo(); // se llama al método "foo" de la clase "B" desde el espacio de nombres "A\A"
// si no se encuentra la clase "A\A\B", se intenta autocargar la clase "A\A\B"
\A\B::foo(); // se llama al método "foo" de la clase "B" desde el espacio de nombres "A"
// si no se encuentra la clase "A\B", se intenta autocargar la clase "A\B"
?>