Namespaces En La Programación Orientada A Objetos

Namespaces en la programación orientada a objetos

Seguimos con otro artículo mas sobre la programación orientada a objetos y hoy concretamente toca aprender qué son y cómo podemos utilizar los namespaces. Algo de mucha utilidad si estas siguiendo el curso y sobre todo si ya has visto el artículo dedicado a la autocarga de clases. Así que vamos para allá…

¿Qué son los namespaces?

Su traducción mas literal sería espacios de nombre, pero entiendo que esto no te diga nada así que vamos a ver una forma de entenderlo.

Imagina que estás re ordenando tu escritorio ya que lo tienes lleno de fotos, archivos y juegos. Como sería normal en una persona ordenada, empezarías a crear carpetas y directorios en el que agrupar los distintos ficheros por tipo por ejemplo o por fecha yo que sé, en cualquier caso estas agrupando ficheros relacionados bajo un criterio definido.

Así pues podemos tener el siguiente árbol de directorios:

  • /home/usuario/gorkamu/Escritorio/fotos/fotovacaciones.png
  • /home/usuario/gorkamu/Escritorio/no-mirar-aqui/esto-no-es-porno.mpg

Como ves hemos organizado nuestros ficheros según dos criterios, ficheros que no nos importan que vean y ficheros que no queremos que otras personas vean (vale, ya sé que no es la mejor solución pero es un ejemplo coño)

Dentro del directorio de fotos podemos tener tantas fotografías como nos de la gana pero lo que nunca podemos tener son dos ficheros con el mismo nombre dentro del mismo directorio.

Pues extendiendo este concepto a la programación orientada a objetos conseguimos los namespaces, se entiende no?

Los namespaces los utilizamos para agrupar de una manera lógica nuestras clases y evitar los conflictos entre nombres debido a que podemos utilizar alias en ellos para renombrar una clase.

Definiendo namespaces

Aunque podemos definir cualquier script mediante los espacios de nombre, en la práctica solo se ven afectadas por los namespaces las clases, las interfaces, los traits, las funciones y las constantes. Si queremos definir un espacio de nombres para nuestra clase tenemos que haces uso de la palabra reservada namespace y siempre al principio del script.

No puede existir otra cosa antes salvo la sentencia declare utilizada para declarar la codificación del fichero.

<?php

namespace Aplicacion\Libreria\Components as Componentes;

class PredectiveSearch 
{
...
}

¿Ves el ejemplo? Pues así de sencillo es definir un namespace. Ah y le hemos dado un alias como ves por la palabra as. Esto viene guay por si tienes diferentes namespaces con el mismo nombre pero en “rutas” distintas, para que no pete y tal… Y viene a ser como manejan los sitemas Unix los enlaces simbólicos

Como he dicho mas arriba, utilizamos los namespaces para “agrupar” clases, interfaces, funciones, traitrs y constantes y parece lógico que cada una de estas estructuras tenga únicamente un único espacio de nombres, algo así como el camino hacia su casa, pero… ¿qué pasa si te digo que podemos hacer que puedan tener varias casas? Por ejemplo, la residencia habitual en Madrid y luego el chabolo en Torrevieja.

Pues de hecho podemos declarar varios namespaces para estas estructuras sin que se rompa nada, mira el ejemplo anda:

Como ves podemos utilizar varios namespaces dentro del mismo fichero. Existen varias sintaxis diferentes para hacer esto y de ellas esta es la menos mala. Digo esto porque se desaconseja su uso con las buenas practicas. Un fichero únicamente debería tener un solo espacio de nombres pero bueno hay que conocer la mierda para tratar de evitarla.

En cualquier caso, tenemos que conocer como funciona el motor de PHP a la hora de resolver espacios de nombres y es que y es que para referenciar el nombre de una clase podemos hacerlo de diferentes formas:

  • Con nombres no cualificados, es decir, si el namespace actual es Aplicacion\Libreria la clase se resolvería con: $search = new PredectiveSearch()
  • Con nombres cualificados o con el nombre de la clase con prefijo, por ejemplo: $seach = new Libreria\PredectiveSearch()
  • Con nombres completamente cualificados o el nombre de la clase con prefijo con el prefijo de operador global: $seach = new\Aplicacion\Libreria\PredectiveSearch()

Es un pelín lioso pero si utilizáis IDEs ultrainteligentes como PHPStorm no os tenéis que preocupar de esto ya que os lo resolverá el solito 😛

PHP ofrece dos mecanismos para acceder de una forma bastante abstracta a elementos que se encuentren en un namespace, esto es mediante la palabra reservada namespace y mediante la constante reservada __NAMESPACE__ cuyo valor será el espacio de nombres que hayas definido para ese fichero.

<?php
namespace Aplicacion\Libreria;

echo '"'.__NAMESPACE__.'"'; // imprime "Aplicacion\Libreria"

Es importante saber que si no se define ningún namespace, todas las clases, funciones, métodos, interfaces y constantes tendrán un ámbito global.

Como curiosidad no está de mas saber como PHP resuelve los espacios de nombres con estas seis reglas:

  • Cualquier elemento con un nombre completamente cualificado se resuelve durante la compilación.
  • Los elementos con nombres cualificados o no cualificados (no completamente cualificado) se resuelve durante la compilación en función de las reglas de importación presentes.
  • Dentro de un espacio de nombres, todos los nombres cualificados no traducidos según la reglas de importación llevan antepuesto el espacio de nombres actual.
  • Los elementos con nombres no cualificados son traducidos en la compilación según las reglas de importación actuales.
  • Dentro de un namespace, las llamadas a funciones con nombres sin cualificar se resuelven durante la ejecución.
  • Dentro de un namespace, las llamadas a funciones con nombres no cualificados o cualificados (no completamente cualificados) se resuelven durante la ejecución.

Así pues con estas reglas y un poquito de sentido común vais a ser capaz de construir aplicaciones muy organizadas, algo primordial cuando la complejidad crece. Se que el tema de los namespaces no es tan sencillo como definir una “ruta” al principio del fichero y a correr, por eso os voy a dejar este enlace con preguntas y respuestas típicas contestadas por si os liáis y también lo que os digo siempre, si tenéis cualquier duda, necesitáis mas ejemplos o simplemente me queréis poner a parir podéis hacerlo en los comentarios mas abajo o en twitter a través del siguiente banner.

@gorkakatua #faqsGorkamu pregúntame por twitter cualquier cosa y vemos cómo lo solucionamos.

Hala a mamarla!

¿Te ha parecido este un artículo de 5 estrellas? Dame tu valoración:
Review Date
Reviewed Item
Namespaces en la programación orientada a objetos
Author Rating
5

Gorka Muñoz Andrés

Me llamo Gorka Muñoz y soy un desarrollador melómano. Combino a la perfección la búsqueda de nuevos grupos con la pasión por la tecnología. Desde chiquitito me ha gustado la programación, ahora que soy mayor estoy metido en el mundo del SEO sin olvidarme del /Dev.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *