Un namespace o espacio de nombre es un contenedor que nos permite agrupar el código para poder tener el código agrupado. Veamos unos ejemplos:
Fichero1.php
//fichero1.php
namespace EspacioDeNombreUno;
function prueba(){
echo "Espacio Uno";
}
//fichero2.php
namespace EspacioDeNombreDos;
function prueba(){
echo "Espacio Dos";
}
//pruebanamespaces.php
EspacioDeNombreDos\prueba(); //Imprime: Espacio Dos
EspacioDeNombreUno\prueba(); //Imprime: Espacio Uno
Los tres ficheros anteriores muestran un ejemplo sencillo de uso de namespaces con funciones. Ahora vamos a mirar un ejemplo usando clases y usando la instrucción use para usar un namespace en concreto.
File1.php
//file1.php
/*FILE file1.php*/
namespace namespace1;
class testClass {
function whoAmI (){
return 'file1' . PHP_EOL;
}
}
File2.php
//file2.php
/*FILE file2.php*
namespace namespace1;
class testClass {
function whoAmI (){
return 'file2' . PHP_EOL;
}
}
test.php
//test.php
use namespace1\testClass as Test1;
use namespace2\testClass as Test2;
//$class1 = new \namespace1\testClass();
$class1 = new Test1();
echo $class1->whoAmI();
$class2 = new Test2();
//$class2 = new \namespace2\testClass();
echo $class2->whoAmI();
En el último código se pueden ver unas líneas comentadas, son una alternativa usar use y usar el namespace directamente. El ejemplo puesto es bastante sencillo. Lo más óptimo es usar el autoload de php para no tener un require o include por cada clase.
IMPORTANTE: En el ejemplo que he puesto se puede ver que no se hace ningún include a ningún archivo de oos que se refiere con la cláusula "use" y se puede hacer de tres maneras:
- Incluyendo todos los archivos que se van a usar. Esta solución no es nada elegante.
- Tener un fichero global que será incluído en todos los ficheros del proyecto y usar autoload, esta solución no está mal, es elegante y te evita tener un montón de includes de archivos.
- Usar composer,para los autoloads ya que usa los namespaces como rutas a los ficheros. Esta solución es la más elegante de las tres.