Es posible que ya sepas que no se puede tener dos clases o funciones con el mismo nombre porque generan un error tipo “Fatal error: Cannot redeclare …..”, da igual que se encuentren en ficheros diferentes si luego se incluyen en un mismo script, tiene su lógica que PHP genere este error dado que el no sabe cual de las dos funciones declaradas es la que ha de ejecutar.

Pero en ocasiones por mantener una lógica con los nombres, o porque nuestra aplicación tiene un tamaño considerable podremos necesitar tener dos funciones, clases, constantes, etcétera con un mismo nombre, para eso existen los namespaces.

Aunque este ejemplo es muy típico he de decir que es realmente sencillo de comprender al verlo, se trata de comparar los namespaces con directorios de archivos, donde en la carpeta A contenemos un fichero llamado miFichero.txt, por lo que no podemos tener otro fichero con el mismo nombre, pero en la carpeta B podemos si podemos tener otro* miFichero.txt, y para referirnos a uno u otro usamos el nombre del directorio más el del fichero, *A/miFichero.txt y B/miFichero.txt.

Para declarar un espacio de nombre debemos usar la instrucción namespace seguido del nombre que queremos “reservar”, y siempre ha de ser en la linea siguiente al tag de apertura de php:

es.php:

<?php 
namespace EspacioDeNombreUno; 

function prueba(){ 
    echo "Espacio Uno"; 
} 
?>

Al hacer esto todas las declaraciones debajo del namespace estarán englobadas por el, y dentro del mismo fichero no hay necesidad de usar ninguna instrucción extra para referirnos a las constantes, funciones o clases declaradas en el.

Creemos otra script que comparta el nombre de nuestra función, por ejemplo:

esdos.php:

<?php 
namespace EspacioDeNombreDos; 

function prueba(){ 
    echo "Espacio Dos"; 
} 
?>

Ahora si queremos usar ambas constantes dentro de un mismo script deberemos de indicar mediante la sintaxis “namespace” + “\” + “nombre del elemento a llamar”:

<?php 
require('es.php'); 
require('esdos.php'); 

EspacioDeNombreDos\prueba(); //Imprime: Espacio Dos
EspacioDeNombreUno\prueba(); //Imprime: Espacio Uno 
?>

Como puedes ver hemos llamado a la función prueba indicándole en que namespace estaba la que queríamos reclamar y no ha generado ningún error por repetir el nombre.

Al igual que con un árbol de directorios podemos crear un árbol de namespaces añadiendo la barra invertida y un nombre a la declaración, por ejemplo:

<?php 
namespace EspacioDeNombreUno; 
function prueba(){ 
    echo "Espacio Uno"; 
} 

namespace EspacioDeNombreUno\SubEspacio; 
function prueba(){ 
    echo "Sub Espacio"; 
} 
?>

Y para llamar a la función se realiza de la forma normal pero añadiendo el subdirectorio:

<?php 
require('es.php'); 
EspacioDeNombreUno\prueba(); //Imprime: Espacio Uno
EspacioDeNombreUno\SubEspacio\prueba(); //Imprime: Sub Espacio 
?>

Todo esto es muy útil, pero el tener que añadir el nombre de espacio más el sub-espacio cada vez que llamamos a una función o a cualquier otro elemento hace pesado y lento el desarrollo, para solucionar esto podemos asignarle un alias para indicarle al motor cual vamos a usar:

<?php 
require('es.php'); 
use EspacioDeNombreUno\SubEspacio as subEs;
subEs\prueba(); //Imprime: Sub Espacio 
?>

En caso de que no incluyas en la sentencia el “as Alias”, el motor concluirá que el alias es la ultima parte del árbol de namespaces, por lo que use EspacioDeNombreUno\SubEspacio dará como alias SubEspacio.