International PHP Conference 2015

Utilizar espacios de nombres: una alternativa a funciones/constantes globales

(PHP 5 >= 5.3.0)

Dentro de un espacio de nombres, cuando PHP se encuentra con nombre no cualificado en un contexto de nombre de clase, función o constante, lo resuelve con diferentes prioridades. Los nombres de clases siempre se resuelven con el nombre de espacio de nombres actual. Así, para acceder a clases de usuario internas o que no son de espacio de nombres, se debe referir a ellas con su nombre completamente cualificado:

Ejemplo #1 Acceder a clases globales dentro de un espacio de nombres

namespace A\B\C;
Exception extends \Exception {}

$a = new Exception('hola'); // $a es un objeto de la clase A\B\C\Exception
$b = new \Exception('hola'); // $b es un objeto de la clase Exception

$c = new ArrayObject// error fatal, no se encontró la clase A\B\C\ArrayObject

Para funciones y constantes, PHP recurrirá a funciones y constantes globales si no existe una función o constante en el espacio de nombres.

Ejemplo #2 Recurrir a funciones/constantes globales dentro de un espacio de nombres

namespace A\B\C;

    return \
strlen($str) - 1;

E_ERROR"\n"// imprime "45"
echo INI_ALL"\n"// imprime "7" - recurre a INI_ALL global

echo strlen('hola'), "\n"// imprime "3"
if (is_array('hola')) { // imprime "no es un array"
echo "es una array\n";
} else {
"no es un array\n";

add a note add a note

User Contributed Notes 2 notes

markus at malkusch dot de
8 months ago
You can use the fallback policy to provide mocks for built-in functions like time(). You therefore have to call those functions unqualified:

namespace foo;

time() {

assert (1234 == time());

However there's a restriction that you have to define the mock function before the first usage in the tested class method. This is documented in Bug #68541.

You can find the mock library php-mock at GitHub.
cory at xison dot ca
1 year ago
I want to throw it out there, I found the following easier to deal with when porting parts of some older code into a new project in regards to accessing global classes.

namespace app\somethingorother;
use \
core as core;



I know it's not exactly the same as the solutions mentioned above, but it works for what I'm trying to accomplish.
To Top