(PHP 5 >= 5.3.0, PHP 7, PHP 8)
A continuación se exponen unas definiciones importantes para 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:
new \A\B
se resuelve con la clase A\B
.
A\B\C
se importa como
C
, una llamada a
C\D\e()
se traduce como A\B\C\D\e()
.
C\D\e()
se lleva a cabo dentro del espacio de nombres A\B
,
se traduce como A\B\C\D\e()
.
A\B\C
se importa como C, new C()
se
traduce como new A\B\C()
.
foo()
:
A\B\foo()
.
foo()
.
A\B
), las llamadas a nombres de clases
no cualificados o cualificados (no los completamente cualificados) se resuelven durante la
ejecución. Así se resuelve una llamada a
new C()
o a new D\E()
.
Para new C()
:
A\B\C
.
A\B\C
.
new D\E()
:
A\B\D\E
.
A\B\D\E
.
new \C()
.
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 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 yfunciones de un 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"
?>