Pre-Laravel: Espacio de nombres

Son muchos los lenguajes que hoy día ya utilizan los espacios de nombres. Pero en PHP no ha sido hasta la versión 5.3 que nos permitiera utilizarlos. En PHP no puedes tener dos clases con el mismo nombre, deben ser únicos. Los espacios de nombres de PHP nos permiten solucionar este problema.

Veamos una clase sencilla y como la podemos declarar:

class Eddard
{
  //..code..
}
$eddard = new Eddard();

Cómo se usan los espacios de nombres

En principio esto no implica ningún problema. Pero para poder hacer uso de los espacios de nombres tenemos que añadir la directiva namespace tal que así:

namespace Stark;

class Eddard
{
  //..code
}

La línea informa a PHP que todo lo que hacemos pertenece al espacio de nombre Stark. También significa que cualquier clase creada dentro de este archivo vivirá dentro del espacio de nombre Stark.

Ahora, cuando intentamos usar la clase Eddard pero del espacio de nombre Stark:

$eddard = new Stark\Eddard();

Se puede instanciar una clase dentro de un espacio de nombre, añadiéndole como prefijo el nombre del espacio de nombre, y separándola con una barra invertida (\). Además los espacios de nombre pueden tener tantos nombres de jerarquía como se necesiten.

Esto\Es\Una\Combinacion\Bastante\Larga\Pero\Funciona

PHP tiene un truco para referirse a clases que están ubicadas en el espacio de nombre global. Simplemente hay que añadir una barra invertida (\) al inicio. Así, PHP sabe que nos estamos refiriendo a la clase del espacio de nombre global e instanciará esa.

$eddard = new \Eddard();

El manejo de «use»

Planteemos la necesidad usar varias clases de nombres de espacios diferentes, sería un engorro tener que utilizar tantas barras invertidas como nombre de espacios necesitemos. Usando la sentencia use, podemos traer una clase de otro espacio de nombre. Permitiéndonos instanciarla solo por el nombre.

namespace Stark;

use Tully\Edmure;

$edmure = new Edmure();

Un truco para usar dos clases que se llamen de forma similar en el mismo espacio de nombre, es darle a nuestra clase un alias con la palabra clave as. Así queda perfectamente diferenciada como en este caso:

namespace Targaryen;

use Dothraki\Daenerys as Khaleesi;

class Daenerys
{
  //..code
}

// Targaryen\Daenerys
$daenerys = new Daenerys();

// Dothraky\Daenerys
$khaleesi = new Khaleesi();

La finalidad final de los espacios de nombres no es solo para evitar conflictos, sino que también podemos usarlos para organizarlos y para autoría. Si por ejemplo, queremos desarrollar un blog, una correcta estructura sería:

Developer\Blog\Content\Post
Developer\Blog\Content\Page
Developer\Blog\Tag
Developer\Blog\Categories\Tutorial

Como se puede ver, es una manera limpia y diferenciadora; además de estructurar correctamente las secciones. Esto nos resultará enormemente útil en la sección de Composer.

Deja un comentario