Espacios de Nombres
PHP Manual

Usar espacios de nombres: Lo básico

(PHP 5 >= 5.3.0)

Antes de hablar del uso de los espacios de nombres es importante entender cómo sabe PHP qué elemento del código del espacio de nombre se requiere. Se puede hacer una simple analogía entre los espacios de nombres de PHP y el sistema de archivos. Existen tres maneras de acceder a un archivo en el sistema de archivos:

  1. Nombre de archivo relativo como foo.txt. Esto se resuelve con directorioactual/foo.txt donde directorioactual es el directorio actualmente ocupado. Por lo que si el directorio actual es /home/foo, el nombre se resuelve con /home/foo/foo.txt.
  2. Nombre de ruta relativa como subdirectorio/foo.txt. Esto se resuelve con directorioactual/subdirectorio/foo.txt.
  3. Nombre de ruta absoluto como /main/foo.txt. Esto se resuelve con /main/foo.txt.
Se puede aplicar el mismo principio a los elementos del espacio de nombres de PHP. Por ejemplo, se puede hacer referencia a un nombre de una clase de tres maneras:
  1. Nombre no cualificado, o nombre de clase sin prefijo como $a = new foo(); o foo::métodoestático();. Si el espacio de nombres actual es espaciodenombresactual, esto se resuelve con espaciodenombresactual\foo. Si el código es global, no es de espacio de nombres, esto se resuelve con foo. Una advertencia: los nombres no cualificados para funciones y constantes se resolverán con funciones y constantes globales si la función o la constante del espacio de nombres no está definida. Véase Usar espacios de nombres: una alternativa a funciones/constantes globales para más detalles.
  2. Nombre cualificado, o un nombre de clase con prefijo como $a = new subespaciodenombres\foo(); o subespaciodenombres\foo::métodoestático();. Si el espacio de nombres actual es espaciodenombresactual, esto se resuelve con espaciodenombresactual\subespaciodenombres\foo. Si el código es global, no es de espacio de nombres, esto se resuelve con subespaciodenombres\foo.
  3. Nombre completamente cualificado, o un nombre con prefijo con el operador de prefijo global como $a = new \espaciodenombresactual\foo(); o \espaciodenombresactual\foo::métodoestático();. Esto siempre se resuelve con nombre literal especificado en el código, espaciodenombresactual\foo.

Aquí hay un ejemplo de los tres tipos de sintaxis en código real:

archivo1.php

<?php
namespace Foo\Bar\subespaciodenombres;

const 
FOO 1;
function 
foo() {}
class 
foo
{
    static function 
métodoestático() {}
}
?>

archivo2.php

<?php
namespace Foo\Bar;
include 
'archivo1.php';

const 
FOO 2;
function 
foo() {}
class 
foo
{
    static function 
métodoestático() {}
}

/* Nombre no cualificado */
foo(); // se resuelve con la función Foo\Bar\foo
foo::métodoestático(); // se resuelve con la clase Foo\Bar\foo, método métodoestático
echo FOO// se resuelve con la constante Foo\Bar\FOO

/* Nombre cualificado */
subespaciodenombres\foo(); // se resuelve con la función Foo\Bar\subespaciodenombres\foo
subespaciodenombres\foo::métodoestático(); // se resuelve con la clase Foo\Bar\subespaciodenombres\foo,
                                           // método métodoestático
echo subespaciodenombres\FOO// se resuelve con la constante Foo\Bar\subespaciodenombres\FOO
                                  
/* Nombre conmpletamente cualificado */
\Foo\Bar\foo(); // se resuelve con la función Foo\Bar\foo
\Foo\Bar\foo::métodoestático(); // se resuelve con la clase Foo\Bar\foo, método métodoestático
echo \Foo\Bar\FOO// se resuelve con la constante Foo\Bar\FOO
?>

Observe que para acceder a cualquier clase, función o constante globales, se puede usar un nombre completamente cualificado, como \strlen() o \Exception o \INI_ALL.

Ejemplo #1 Acceder a clases, funciones y constantes globales desde un espacio de nombres

<?php
namespace Foo;

function 
strlen() {}
const 
INI_ALL 3;
class 
Exception {}

$a = \strlen('hola'); // llama a la función global strlen
$b = \INI_ALL// accede a la constante global INI_ALL
$c = new \Exception('error'); // instancia a la clase global Exception
?>


Espacios de Nombres
PHP Manual