Si vienes de C sharp o Java World, los espacios de nombres no son una idea nueva para ti. En PHP, fue solo una vez que se lanzó PHP 5.3 que los espacios de nombres obtuvieron soporte oficial en el idioma. Los espacios de nombres están cambiando la forma en que se escriben las aplicaciones en PHP, y probablemente sean una de las adiciones más importantes al lenguaje en los últimos tiempos. En este episodio, veremos qué son los espacios de nombres, por qué nos benefician y cómo usarlos. ¡Vamos a profundizar en!

¿Qué problemas resuelven los espacios de nombres?

Cuando comenzó su programación PHP, probablemente descubrió que con el tiempo a medida que sus programas se volvían más grandes, las cosas comenzaron a desordenarse y a ser difíciles de encontrar. Además de esto, es posible que haya comenzado a agregar bibliotecas de otros desarrolladores. Agregar más clases y nombres de métodos a su proyecto comienza a ser problemático sin espacios de nombres porque si tiene una clase o método con el mismo nombre, su programa fallará. A esto se le llama tener colisiones. Con los espacios de nombres, solucionamos el problema de las colisiones en nuestro código base. Los espacios de nombres admiten clases, funciones y constantes de PHP.

Ejemplo de espacio de nombres PHP

Antes de los espacios de nombres, todo el código PHP simplemente vivía en un espacio de nombres global. Podemos colocar un fragmento de código PHP en un espacio de nombres usando el comando de espacio de nombres así:

Cualquier código PHP que venga después de esta línea ahora vive en el espacio de nombres Vegibit. También puede definir más de un espacio de nombres en el mismo archivo PHP así:

A decir verdad, probablemente sea una buena idea mantener su espacio de nombres en uno por archivo PHP. Después de todo, está utilizando espacios de nombres para reducir las colisiones y la confusión en la aplicación, sin necesidad de complicar las cosas. Sin embargo, el ejemplo anterior destaca muy bien el beneficio de los espacios de nombres. ¿Observa que tanto el espacio de nombres de Google como el de Bing tienen una clase denominada búsqueda y un método denominado consulta? ¡No puede hacer eso en el espacio de nombres global! Sin embargo, dado que declaramos estas clases y métodos en diferentes espacios de nombres, podemos usar cada clase y método al contenido de nuestro corazón, sin necesidad de preocuparnos por encontrar colisiones.

Jerarquía del espacio de nombres PHP

La mayoría de las veces verá espacios de nombres siguiendo la convención de hacer coincidir una estructura de carpetas. Al utilizar un carácter de barra invertida entre los nombres de las carpetas, por así decirlo, puede definir convenciones de nomenclatura muy precisas para el lugar donde residen sus bibliotecas y el código PHP. Tal vez tenga algún código que se ocupe de la API de Facebook. Puede declarar código en esa carpeta así, namespace VegibitFacebookmientras que el código de su base de datos podría serlo namespace VegibitDatabaseMySQLy los métodos auxiliares comunes podrían usar namespace VegibitCommonStringHelpersEs muy flexible.

Cómo utilizar el código con espacio de nombres

Hasta ahora solo hemos visto cómo definir espacios de nombres y colocar código dentro de ellos. ¿Qué pasa cuando realmente necesitamos hacer uso de ese código? Echemos un vistazo a un ejemplo de espacio de nombres para demostrarlo. Crearemos un archivo con nombre vegilib.phpy definiremos una constante, función y clase con el Applicationvegilibespacio de nombres. Echale un vistazo:

vegilib.php

Para llamar a este código, podemos usar PHP así:

application.php

Resultados en:

Notarás que tuvimos que usar la ruta completa del espacio de nombres para que este código se ejecute correctamente. Esto es lo que se conoce como un espacio de nombres completo e incluye la barra invertida inicial. Entonces, ¿qué sucede si ponemos el código de esta aplicación dentro del mismo espacio de nombres? ¡Veamos!

application.php (espacio de nombres)

¡Increíble! Dado que ahora tenemos el código de la aplicación viviendo en el mismo espacio de nombres, puede ver que en lugar de tener que usar la ruta completa en nuestro código de ejecución, simplemente podemos acceder a nuestra constante, función y método de clase directamente ya que estamos en el mismo espacio de nombres .

Importación de espacios de nombres

Como acabamos de ver, puede colocar el código de su aplicación en el mismo espacio de nombres que su biblioteca, y esto le dará acceso directo a las entrañas de esa biblioteca sin tener que especificar el espacio de nombres completamente calificado. Veamos la importación de espacios de nombres con las palabras clave useas, ¡es bastante hábil! Dividiremos nuestro ejemplo anterior de los espacios de nombres de Google y Bing en archivos de clase separados para este ejemplo.

google.php

bing.php

Si actualizamos nuestro archivo application.php a lo siguiente:

Resultados en

Ahora veremos que podemos buscar en Google y Bing usando los mismos nombres de clase y método, solo desde otro espacio de nombres. Tome nota de ambos use Google as g;use Bing as b;Lo que esto dice es que queremos usar cada espacio de nombres como algo más. Entonces, en el caso del espacio de nombres de Google, podemos instanciar un objeto como este $searchengine = new gSearch;y para instanciar un objeto en el espacio de nombres de Bing podemos hacer esto$searchengine = new bSearch;

Si omitimos las líneas:

todavía podemos usar esas clases y métodos, pero ahora tendremos que incluir el espacio de nombres completo cuando intentemos crear una instancia de un objeto como este:

Algo de esto es una cuestión de preferencia, mientras que algo de esto es bastante matizado hasta el punto de que si no sigue las convenciones de manera muy específica, su aplicación se romperá. En caso de duda, consulte los documentos oficiales y varias definiciones y reglas para asegurarse de que está siguiendo las mejores prácticas.

¿Qué es __NAMESPACE__?

Esta es una constante que se refiere al espacio de nombres actual. En el espacio de nombres global, esta constante no tiene valor o es una cadena vacía. Ajustemos nuestro código de aplicación más reciente para probar esto:

Ahora lo que tenemos aquí es un fragmento de código PHP que vive en el espacio de nombres de Bing. Dentro de este espacio de nombres, importamos el espacio de nombres de Google y lo alias como la letra g. Por lo tanto, se ejecuta la creación del objeto y la llamada al método, y buscamos en google. Haciendo eco de la constante __NAMESPACE__, podemos ver que sí, este archivo vive en el espacio de nombres de Bing.

Entonces, ¿para qué sirve esto? ¡Una buena pregunta en verdad! Resulta que puede utilizar esta constante con fines de depuración, así como para crear nombres de clase totalmente calificados generados dinámicamente.

Espacios de nombres y carga automática

Los espacios de nombres serán clave para que utilice la carga automática en sus proyectos PHP en el futuro. Como mencionamos en este tutorial de carga automática de Composer , Composer hace un uso intensivo de los espacios de nombres para que funcione de manera mágica. Si aprende sus espacios de nombres y sus estándares psr-0 y psr-4, estará bien equipado para manejar los nuevos métodos de flujo de trabajo PHP.