Espacios de Nombres
PHP Manual

Reglas de resolución de nombres

(PHP 5 >= 5.3.0)

Aquí hay algunas definiciones importantes para los propósitos de estas reglas de resolución:

Definiciones de nombres de espacios de nombres
Nombre no cualificado

Es un identificador sin un separador de espacios de nombres, como Foo

Nombre cualificado

Es un identificador con un separador de espacios de nombres, como Foo\Bar

Nombre completamente cualificado

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:

  1. Las llamadas a clases, funciones o constantes completamente cualificadas se resuelven en tiempo de compilación. Por ejemplo new \A\B se resuelve con la clase A\B.
  2. Todos los nombres no cualificados y cualificados (no los completamente cualificados) se traducen durante la compilación según las reglas de importación actuales. Por ejemplo, si el espacio de nombres A\B\C se importa como C, una llamada a C\D\e() se traduce a A\B\C\D\e().
  3. Dentro de un espacio de nombres, todos los nombres cualificados no traducidos según la reglas de importación tienen añadido al inicio el espacio de nombres actual. Por ejemplo, si una llamada a C\D\e() se lleva a cabo dentro del espacio de nombres A\B, es traduce a A\B\C\D\e().
  4. Los nombres de clases no cualificados se traducen durante la compilación según las reglas de importación actuales (el nombre completo sustituido por el nombre abreviado importado). Por ejemplo, si el espacio de nombres A\B\C se importa como C, new C() se traduce a new A\B\C().
  5. Dentro de un espacio de nombres (digamos A\B), las llamadas a funciones no cualificadas se resuelven en tiempo de ejecución. Aquí se muestra cómo se resuelve una llamada a la función foo():
    1. Se busca una función desde el espacio de nombres actual: A\B\foo().
    2. Se intenta encontrar y llamar a la función global foo().
  6. Dentro de un espacio de nombres (digamos A\B), las llamadas a nombres de clases no cualificados o cualificados (no los completamente cualificados) se resuelve en tiempo de ejecución. Aquí se muestra cómo se resuelve una llamada a new C() o a new D\E(). Para new C():
    1. Se busca una clase desde el espacio de nombres actual: A\B\C.
    2. Se intenta autocargar A\B\C.
    Para new D\E():
    1. Se busca una clase añadiendo al inicio el espacio de nombres actual: A\B\D\E.
    2. Se intenta autocargar A\B\D\E.
    Para referenciar cualquier clase global en el espacio de nombres global, se debe usar su nombre completamente cualificado new \C().

Ejemplo #1 Las resoluciones de nombres ilustradas

<?php
namespace A;
use 
B\DC\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"
?>

Espacios de Nombres
PHP Manual