Inicio > PHP > Namespaces

NAMESPACES

11/10/2017PHP

 

Cuando empecé a mirar symfony por mi cuenta, vi que se usaban namespaces. Algo que me pareció rarísimo ya que no me sonaba que en php se usasen namespaces. Así que decidido investigar para que sirven y como usarlos. Los namespaces son para evitar conflictos cuando varias clases, de un mismo proyecto, van a tener el mismo nombre pero si que van a tener diferente uso. Así que se definen namespaces para englobar unas clases y se definirán otros namespaces para otras clases.
Pongamos el ejemplo que se está realizando un proyecto que tiene la clase coches para gestionar los coches de flota de la empresa y se necesita otra clase coches para gestionar los coches de los empleados que se guardan ene l parking de la empresa para el control de parking, etc...Habría dos cases coches pero que son diferentes así que dichas clases estarían en namespaces diferentes.
Los namespaces no son necesarios si se realizan proyectos pequeños. Los namespaces solo tienen sentido en proyectos grandes donde es más probable que haya un conflicto por nombre de clases.
Veamos un ejemplo:
Fichero1.php


//fichero1.php
<?php

namespace EspacioDeNombreUno;

function prueba(){

echo "Espacio Uno";

}

?>


Fichero2.php


//fichero2.php
<?php

namespace EspacioDeNombreDos;

function prueba(){

echo "Espacio Dos";

}

?>

Fichero pruebanamespaces.php


<?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 uses para usar un namespace en concreto.
File1.php


//file1.php
<?php

/*FILE file1.php*/
namespace namespace1;
class testClass {
function whoAmI (){
return 'file1' . PHP_EOL;
}
}

?>

File2.php


//file2.php
<?php

/*FILE file2.php*/ namespace namespace1; class testClass {
function whoAmI (){
return 'file2' . PHP_EOL;
}
}

?>

test.php


//test.php
<?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 nameespaces como rutas a los ficheros. Esta solución es la más elegante de las tres.