DevTips – Espacios de nombres en PHP
Publicado: 2020-03-06Hace aproximadamente un año, WordPress decidió actualizar la versión mínima requerida de PHP, de 5.2 (utilizada desde 2010) a algo más actualizado. De hecho, a día de hoy la versión mínima de PHP recomendada por WordPress es una de las más recientes: PHP 7.3.
Si eres un simple usuario de WordPress, probablemente esto no te impacte demasiado (más allá de que estas nuevas versiones dan un mejor rendimiento).
Pero si eres un desarrollador, estas nuevas versiones de PHP tienen algunas características increíbles que puedes usar en tus complementos y temas. Y hoy, en concreto, me gustaría hablaros de uno que lleva mucho tiempo con nosotros pero: los espacios de nombres.
WordPress y prefijos de código
Una de las primeras reglas que aprendes como desarrollador de WordPress es "usar prefijos en todo lo que hacemos" para evitar "colisiones de nombres". Como podemos leer en las mejores prácticas de WordPress:
Una colisión de nombres ocurre cuando su complemento usa el mismo nombre para una variable, función o clase que otro complemento.
[Para evitar colisiones de nombres], todas las variables, funciones y clases deben tener un prefijo de identificador único. Los prefijos evitan que otros complementos sobrescriban sus variables y llamen accidentalmente a sus funciones y clases. También le impedirá hacer lo mismo.
Las mejores prácticas para desarrollar complementos de WordPress
Así, por ejemplo, en lugar de crear una función como get_site_id , es mejor nelio_content_get_site_id . De esta forma, podemos identificar rápidamente el complemento ( nelio_content ) o el tema al que pertenece una determinada función ( get_site_id ) y evitar errores fatales si varios complementos intentan definir la misma función.
El uso de prefijos es una forma rudimentaria de crear un "espacio de nombres"; una solución que tuvimos que implementar cuando no teníamos una alternativa mejor. Todos aquellos elementos que utilizan el mismo prefijo forman parte del mismo conjunto o espacio de nombres. Pero esto da como resultado un código innecesariamente más complejo: los nombres son más largos debido a los prefijos que no tienen otro propósito que emular espacios de nombres.
Espacios de nombres de PHP
PHP versión 5.3 introdujo el concepto de espacio de nombres . La definición que dan de ella en la documentación me parece excelente, así que la reproduzco aquí:
En la definición más amplia, los espacios de nombres son una forma de encapsular elementos. Esto puede verse como un concepto abstracto en muchos lugares. Por ejemplo, en cualquier sistema operativo, los directorios sirven para agrupar archivos relacionados y actúan como un espacio de nombres para los archivos dentro de ellos. Como ejemplo concreto, el archivo foo.txt puede existir tanto en el directorio /home/greg como en /home/other , pero dos copias de foo.txt no pueden coexistir en el mismo directorio.
En el mundo de PHP, los espacios de nombres están diseñados para resolver dos problemas que encuentran los autores de bibliotecas y aplicaciones al crear elementos de código reutilizables, como clases o funciones:
1. Colisiones de nombres entre el código que crea y el código PHP interno o el código de terceros.
2. Capacidad para crear un alias (o acortar) Extra_Long_Names , mejorando la legibilidad del código fuente.
documentos PHP
Cómo crear un espacio de nombres
Crear un espacio de nombres en PHP es extremadamente fácil. Al comienzo del archivo PHP que cree, agregue una directiva de namespace de nombres con el nombre que desea usar y "todo" que defina en ese archivo pertenecerá a ese espacio de nombres:
<?php namespace Nelio_Content; ¡Sí, es así de simple! Ahora “todo” lo que creemos ahí estará en el namespace de Nelio_Content . Por ejemplo, si defino una función como la que mencioné al principio:
<?php namespace Nelio_Content; function get_site_id() { // ... } ahora sabemos que get_site_id está dentro del espacio de nombres de Nelio_Content . De esta forma, ya no tendremos que utilizar el prefijo nelio_content_ a la hora de definir la función. ¡Genial!
Excepciones a los espacios de nombres
Si observa detenidamente lo que le he dicho hasta ahora, verá que he estado escribiendo "todo" entre comillas: "'todo' que agreguemos allí pertenecerá al espacio de nombres especificado". ¿Por que hice eso? Debido a que los espacios de nombres no se aplican absolutamente a todo el código que escribimos... hay algunas excepciones.

Los espacios de nombres de PHP solo cubren los siguientes elementos de PHP:
- Clases
- Interfaces
- Rasgos
- Funciones
- Constantes declaradas con
constpero no condefine
Además, hay algunas cosas adicionales en WordPress que también necesitan sus propios espacios de nombres y, desafortunadamente, los espacios de nombres de PHP no cubren: los identificadores de su script, las opciones de la base de datos o los tipos de contenido personalizado y sus metadatos, etc. En todos estos casos, debe seguir usando prefijos.
Cómo importar elementos de un espacio de nombres a otro
Si necesita usar un elemento que está en su propio espacio de nombres, no tiene que hacer nada especial: simplemente llámelo por su nombre. Por ejemplo, en el siguiente fragmento de código:
<?php namespace Nelio_Content; function get_site_id() { // ... } function get_auth_token() { $site_id = get_site_id(); // ... } Puedes ver que hemos definido dos funciones: get_site_id y get_auth_token , ambas dentro del namespace de Nelio_Content . Cuando get_auth_token necesita usar get_site_id , simplemente lo llama como de costumbre.
Si, por otro lado, necesita usar get_site_id en un espacio de nombres diferente, debe llamar a la función usando su identificador completo:
<?php namespace Something_Else; function do_some_action() { $site_id = Nelio_Content\get_site_id(); // ... } o debe importar la función con la palabra clave use :
<?php namespace Something_Else; use Nelio_Content\get_site_id; function do_some_action() { $site_id = get_site_id(); // ... } Personalmente, me gusta mucho la segunda opción: al usar la palabra clave use para importar funciones de otros espacios de nombres, puede echar un vistazo rápido al encabezado de su archivo e identificar sus dependencias.
Filtros y acciones de WordPress con espacios de nombres de PHP
Hay un detalle importante que debe tener en cuenta al usar espacios de nombres junto a los filtros y acciones de WordPress. Cuando especifica devoluciones de llamada de filtro y acción, generalmente lo hace dando el nombre de devolución de llamada como una cadena:
<?php // ... add_action( 'init', 'do_some_action' );El problema es que si esta función está dentro de un espacio de nombres, el enlace anterior no funcionará como se esperaba; debe decirle a WordPress el nombre completo de la función. En otras palabras, debe incluir su espacio de nombres (si lo tiene).
¿Está agregando el gancho en el archivo donde define el espacio de nombres en sí? No importa, usa el nombre completo:
<?php namespace Nelio_Content; function do_some_action() { // ... } add_action( 'init', 'Nelio_Content\do_some_action' ); ¿Está en otro espacio de nombres pero importó la función con use ? Tampoco importa, usa el nombre completo:
<?php namespace Something_Else; use Nelio_Content\do_some_action; // ... add_action( 'init', 'Nelio_Content\do_some_action' );Uso de alias con nuestros espacios de nombres
Otra funcionalidad muy interesante de los espacios de nombres es el alias. Imagina el siguiente escenario:
<?php namespace Nelio_Content; function get_site_id() { // ... } Si quiero usar esta función en otro espacio de nombres, ya vimos que puedo hacerlo con use . Pero, ¿cómo usaría esta función si el módulo en el que quiero usarla ya tiene una función llamada get_site_id ?
Bueno, afortunadamente para mí, podemos crear un alias para nuestras importaciones con nuevos nombres:
<?php namespace Something_Else; use Nelio_Content\get_site_id as get_nc_site_id(); function get_site_id() { // ... } function do_some_action() { $nc_site_idd = get_nc_site_id(); // ... }¡Comience a usar espacios de nombres hoy!
Los espacios de nombres son una herramienta fantástica para evitar colisiones de nombres y organizar nuestro código. De hecho, y aunque no he comentado en este post, existen estándares como el PSR-4 que permiten a PHP autocargar clases en función de la estructura de espacios de nombres que utilices y de cómo organices el código en directorios y archivos.
Si aún no utiliza espacios de nombres en sus proyectos, le recomendamos que empiece a hacerlo a partir de ahora. ¡Cuéntanos tu experiencia en los comentarios!
Imagen destacada de Chaitanya Tvs en Unsplash.
