Blog de Gonzalo

Namespaces

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

//fichero2.php
namespace EspacioDeNombreDos;
function prueba(){
echo "Espacio Dos"; }

Fichero pruebanamespaces.php

//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.