✅ Noticias, temas, complementos de WEB y WordPress. Aquí compartimos consejos y las mejores soluciones para sitios web.

Espacios de nombres y carga automática en WordPress

6

La semana pasada, hice mi presentación en WordCamp Atlanta sobre espacios de nombres y carga automática. (el título completo era Espacios de nombres, carga automática y mejora de la arquitectura de complementos, pero eso es un bocado, ¿no?)

Debido a la naturaleza de la charla, opté por escribir una publicación para acompañar la publicación, compartir las diapositivas y compartir un complemento de ejemplo de GitHub para ayudar a respaldar la charla.

Entonces, si asistieron, gracias (!) Y aquí está la publicación, lo prometí. Y para aquellos de ustedes que no asistieron, espero que esta publicación aún ayude a demostrar los conceptos y temas que discutí en WordCamp.

Espacios de nombres y carga automática

Antes de hablar sobre los espacios de nombres y la carga automática en WordPress, la razón por la que quiero hablar sobre esto es porque puede afectar directamente la calidad de su código y puede hacerlo durante los próximos meses y años.

Después de todo, muchos de nosotros, los desarrolladores, ya no hacemos la pregunta:

¿Cómo podemos hacer que nuestro código sea mejor de lo que ya es?

Y muchos de nosotros somos lo suficientemente inteligentes como para saber lo que no sabemos. Así que nos enfrentamos a trabajar dentro de las limitaciones que nos dan.

A veces tenemos tiempo para investigar formas de hacer esto; otras veces, tenemos trabajo con el conocimiento que tenemos. Y no hay nada de malo en eso.

Pero como sabemos lo que no sabemos, sabemos que hay potencial para más.

Primero, su código

Cuando se trata de hablar sobre temas como los espacios de nombres y la carga automática en el contexto de WordPress, creo que a menudo nos encontramos con respuestas mixtas.

Después de todo, podríamos estar hablando de cosas como el personalizador de temas o la API REST o algo más divertido.

Quiero decir, "espacios de nombres y carga automática" simplemente no suena emocionante o avanzado cuando se compara con las características y tecnologías más nuevas que están disponibles, ¿verdad?

Pero no, no son realmente aburridos. Y a través de esta publicación y la presentación y el código fuente que la acompañan, les mostraré por qué y cómo no lo son.

no son aburridos

Creo que es justo decir que los desarrolladores, al menos una parte de nosotros o una parte de ellos, dependiendo de cómo te veas a ti mismo, son conocidos por discutir sobre aspectos de la programación.

"Conversación aburrida de todos modos".

De hecho, no es raro escuchar a alguien discutiendo sobre la mejor manera de inicializar y escribir un bucle for que tenga el mayor rendimiento posible al iterar sobre un pequeño conjunto de bases de datos a pesar de que tenemos procesadores de cuatro núcleos y 16 GB de RAM. en nuestras máquinas de escritorio.

Entonces, si nos preocupamos tanto por algo tan pequeño, seguramente nos preocupamos por el panorama general. Cosas como:

  • Código mejorado
  • Mejor organización
  • Mayor mantenibilidad
  • Depuración más fácil
  • Ganar más dinero (bueno, tal vez).

Y los espacios de nombres y la carga automática pueden conducir directamente a todo lo anterior (bueno, no puedo hablar de dinero, pero tiene potencial).

Si tuviera que resumir los espacios de nombres de roles y el lugar de carga automática en todo lo anterior, diría que:

Los espacios de nombres y la carga automática conducen a un código mejorado a través de una mejor organización, compartimentación o modularización, y una relación más estrecha a través de sus conceptos.

Además, esto aumenta la capacidad de mantenimiento porque el código se organiza en paquetes, lo que puede facilitar la depuración a medida que crece el producto.

Todo esto puede conducir a un ahorro de tiempo o un mejor uso del tiempo, lo que, según su modelo de negocio, puede afectar sus resultados.

Pero esto todavía no describe ninguna de estas cosas. Pero seguramente, en este punto, suenan más interesantes que cuando se presentaron por primera vez.

Entonces, ¿qué son?

Antes de entrar en las definiciones de cada uno y las funciones que desempeñan, echemos un vistazo a cómo la falta de espacios de nombres y la carga automática en WordPress ha afectado negativamente su experiencia al usar temas, complementos, complementos o cualquier otra cosa que tenga.

Así que retrocedamos por un momento y veamos cada uno de ellos individualmente.

Espacios de nombres

Imagina que has heredado un proyecto y estás a punto de empezar a trabajar en él. Digamos que es un complemento de WordPress.

Lo instalas; vas a activarlo y luego te dan al menos uno de estos:

  • Tal vez vea ese desagradable mensaje de organización en la parte superior de la ventana del navegador que muestra un seguimiento de la pila.
  • Tal vez vea un mensaje que habla de algún conflicto con otro paquete existente.
  • O tal vez cuando intenta activar un complemento, la página se actualiza pero el complemento no se activa.
  • Tal vez incluso haya realizado una auditoría de código y vea comprobaciones de class_exists en todo el código base.

Cualquiera o todos los anteriores pueden contribuir a los problemas, por supuesto, con los proyectos de WordPress. Pero los espacios de nombres realmente pueden arreglar mucho de esto la mayor parte del tiempo.

Es decir, la razón por la que está experimentando estos problemas es que el código con el que está trabajando es parte del espacio de nombres global (en lugar de su espacio de nombres) y a PHP no le gusta cuando hay clases y módulos con el mismo nombre. .

Pero cuando asignas un espacio de nombres a algo, le das su área relativa a sí misma que seguirá funcionando bien con otros componentes, incluso si tienen el mismo nombre de clase.

Cargadores automáticos

En lo que respecta a los cargadores automáticos, son un poco menos complicados en algunos aspectos. Primero, piensa en el código que escribes o el código con el que trabajas, especialmente en el contexto de los complementos de WordPress, y luego piensa en cuántas veces escribes o ves lo siguiente:

Y a veces los ve en la parte superior del archivo que inicia el complemento y, a veces, los ve dispersos por todo el código base.

Si todos están contenidos en un solo archivo, eso no es tan malo porque al menos sabes dónde están. Pero si están esparcidos por todas partes, entonces no tiene idea de dónde se está introduciendo una dependencia en el sistema.

La carga automática puede resolver todo esto cargando las dependencias cuando sea necesario (y para aquellos que estén interesados, la carga automática es más rápida que la inclusión manual).

Espacios de nombres

Dicho todo esto, estamos listos para hablar sobre los espacios de nombres y la carga automática. Pero los espacios de nombres son el concepto fundamental, así que empezaremos por ahí.

Pero después de todo lo anterior, puedes ver las ventajas de usarlos. Tal vez incluso son divertidos, ¿verdad? ¿Quizás?

Independientemente, necesitamos una definición a partir de la cual podamos trabajar cuando hablemos de esto durante el resto del artículo.

El manual de PHP proporciona la siguiente definición :

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…

Y eso no está mal, pero es bastante largo, técnico y puede ser demasiado para aquellos que recién comienzan. Así que vamos a simplificarlo un poco para este artículo:

¿Un poco mejor, tal vez?

Una forma de agrupar clases e interfaces relacionadas que tienen un propósito similar.

No voy a hablar de interfaces en esta charla; sin embargo, sé que hay desarrolladores orientados a objetos de nivel intermedio que los usan, así que quería asegurarme de mencionarlos al menos.

Un ejemplo práctico

No me gustan los ejemplos de programación que no ofrecen aplicaciones prácticas o del mundo real. A menudo, se nos dan ejemplos de cosas que nunca codificaríamos.

¿Cuántas veces ha leído un artículo orientado a objetos y da un ejemplo de una clase de animal o una clase de automóvil? No vamos a estar programando un auto.

Es mucho más probable que trabajemos con archivos. Así que vamos a echar un vistazo a un conjunto de clases responsables de leer y escribir archivos. Es decir, hemos sido buenos programadores orientados a objetos y separamos nuestras clases en función de las responsabilidades que mantienen.

Y sí, puede tener interfaces; sin embargo, están fuera del alcance de este artículo, por lo que no se incluirán.

Entonces, para nuestro FileReader, quizás los conceptos básicos de la clase se vean así:

Espacios de nombres y carga automática en WordPress

Una clase para leer archivos.

Observe que la función acepta el nombre del archivo que debería abrir para leer. La comprobación de errores, cómo lee el archivo y lo que devuelve depende de la implementación de la clase.

Y para FileWriter, tenemos algo como esto:

Espacios de nombres y carga automática en WordPress

Una clase para escribir archivos.

Esta clase, por otro lado, acepta la información que va a escribir en el disco y el nombre del archivo en el que debe escribirse.

Una vez más, como en el ejemplo anterior, no incluye la verificación de errores, la escritura a través de un recurso, el cierre de los recursos, etc.

Pero esto no se trata de trabajar con archivos. En su lugar, se trata de mostrar cómo asignar un espacio de nombres a su código, y estos dos ejemplos están destinados a ser fundamentales para eso.

Notas sobre los espacios de nombres

Hay una advertencia sobre lo que ve en las imágenes del código de muestra anterior: estas clases no tienen espacios de nombres. Es decir, residen en el espacio de nombres global que los deja maduros para conflictos con otras clases.

Míralo de esta manera: imagina que empaquetas este código en un complemento para otra persona, y luego cargan otro complemento que también funciona como FileReader o FileWriter. Dado que todo formará parte del mismo espacio de nombres global, se enfrentará a un conflicto.

Recuerda:

Los espacios de nombres son una forma de agrupar clases e interfaces relacionadas que tienen un propósito similar.

Así que tomemos las clases y el espacio de nombres del código.

Primero, proporcionaremos un espacio de nombres de nivel superior bajo el cual residirán estas clases y todas las demás clases; luego proporcionaremos un subpaquete (o subespacio de nombres o subespacio como los he oído llamar) en el que residirán estas clases de archivos.

Esto significa que nuestro FileReader ahora se verá así:

Espacios de nombres y carga automática en WordPress

Una clase con espacio de nombres para leer archivos.

Y nuestro FileWriter ahora se verá así:

Espacios de nombres y carga automática en WordPress

Una clase con espacio de nombres para escribir archivos.

Primero, puede ver que usar espacios de nombres es fácil: simplemente use la palabra clave del espacio de nombres y luego declare el espacio de nombres (que podría ser WCATL fácilmente) en la parte superior con los subpaquetes a continuación.

Pero esto lleva a otros temas, a saber, sobre la organización de archivos, la creación de instancias y la carga automática, todos los cuales vale la pena cubrir.

Organización en archivo

En este punto, es importante tener una palabra sobre la organización de archivos. Dependiendo de con quién hable, encontrará que algunos desarrolladores, sorpresa, sorpresa, tienen una opinión sobre cómo deben organizarse los archivos (y yo no soy diferente).

Por un lado, no tienes que organizar tus archivos en absoluto. De hecho, puede colocar cada cosa en el directorio raíz de su proyecto, asignar un espacio de nombre a la información y estar listo para comenzar.

Espacios de nombres y carga automática en WordPress

Archivos no organizados

El conjunto de archivos anterior es para un proyecto pequeño, por lo que puede imaginar cuántos archivos existirían para un proyecto grande.

Pero cuando tiene sus archivos organizados de esta manera, puede hacer que escribir un autocargador sea un poco difícil porque un autocargador necesita saber dónde encontrar los archivos según su espacio de nombres.

Aquí es donde entran en juego los términos “organización lógica" y “organización virtual”.

  • Organización lógica se refiere a cómo se organizan los archivos en el disco, como lo que ve arriba. Están ubicados lógicamente en el directorio raíz.
  • Organización virtual se refiere a cómo se organizan los archivos con respecto a sus espacios de nombres. Eso significa que hay directorios y subdirectorios que se asignan a los espacios de nombres, subpaquetes, etc.

Entonces, si tomara el proyecto anterior, sus espacios de nombres, sus subpaquetes y luego los organizara de manera lógica y virtual, se vería así:

Espacios de nombres y carga automática en WordPress

Espacios de nombres y carga automática: archivos organizados

Y aunque puedes optar por organizar tus archivos como quieras, soy fanático de asegurarme de que haya paridad entre los dos. Es decir, me gusta que mi organización lógica y virtual coincidan como se ve en la imagen de arriba.

A medida que avance en la discusión de la carga automática, verá por qué esto es importante.

Notas sobre los espacios de nombres

Sin embargo, ¿qué sucede cuando necesitamos crear instancias de clases que tienen espacios de nombres? Cuando las clases no tienen espacios de nombres, es fácil usar la palabra clave ‘nuevo’.

Espacios de nombres y carga automática en WordPress

Creación de instancias sin un espacio de nombres.

Pero tenemos que instanciar una clase con espacio de nombres, tenemos que ir un paso más allá y usar el nombre completo:

Espacios de nombres y carga automática en WordPress

Espacios de nombres y carga automática: creación de instancias con un espacio de nombres.

Pero esto se vuelve engorroso, ¿no? Este ejemplo en particular no es tan malo, pero imagina que estuvieras trabajando en algo con más subpaquetes. Sería bastante engorroso, ¿no?

Para ese fin, podemos usar lo que se llama aliasing. Es simple, también. Podemos definir el uso de la palabra clave ‘use’ en la parte superior del archivo para referirnos al espacio de nombres que queremos alias y luego usar el último subpaquete como parte del alias para instanciar nuestra clase.

Suena confuso, ¿no? Tal vez verlo en acción ayude:

Espacios de nombres y carga automática en WordPress

Espacios de nombres de alias.

Y eso es todo lo que hay que hacer. Sí, puede llevar el alias un paso más allá, pero esto es todo lo que estoy tomando en el contexto de este artículo.

Carga automática

En este punto, tenemos las bases sentadas para la carga automática. Sí, trabajar con espacios de nombres puede ser mucho trabajo si no está acostumbrado; sin embargo, es importante entenderlo porque la carga automática requiere un poco de trabajo que puede ser inesperado si nunca antes lo ha presentado.

Independientemente, las cosas más importantes para recordar con respecto a los espacios de nombres, en este punto, son:

  1. Los espacios de nombres son una forma de agrupar clases e interfaces relacionadas que tienen un propósito similar.
  2. Cree paridad a través de sus archivos y espacios de nombres asegurándose de que su organización lógica y virtual sean iguales.

Y ahora es el momento de ver la carga automática.

Notas sobre la carga automática

Primero, veamos la definición de carga automática proporcionada por el manual de PHP :

La función spl_autoload_register() registra cualquier cantidad de cargadores automáticos, lo que permite que las clases y las interfaces se carguen automáticamente si no están definidas actualmente. Al registrar cargadores automáticos, PHP tiene la última oportunidad de cargar la clase o la interfaz antes de que falle con un error.

No está mal. Aunque es largo. Entonces, tal como hicimos con los espacios de nombres, usemos una definición más corta para este artículo:

Una forma de cargar automáticamente interfaces y clases sin usar declaraciones include y require.

Nuevamente, no usaremos interfaces en este artículo, aunque algunos desarrolladores sí lo hacen. Y eso proporcionará la definición de trabajo para el resto de este artículo.

Un ejemplo práctico

Una vez que tenga sus archivos organizados, con espacios de nombres y listos para cargar, entonces es hora de hacer precisamente eso, ¿verdad? Quiero decir:

  1. sus archivos están organizados,
  2. estás listo para cargarlos

Así que es hora de hacerlo automáticamente, ¿verdad? Pero hay una trampa. Todos los archivos de "carga automática" requieren un poco de trabajo.

Escribir un cargador automático

Es decir, es automático, pero aún requiere un poco más de trabajo por nuestra parte. Antes de entrar en esos pasos, es importante tener en cuenta:

  1. no está totalmente automatizado,
  2. tenemos que escribirlo.

Tan bueno como sería tener el código cargado automáticamente, tenemos que leer algunos datos, analizarlos y luego intentar cargar el archivo adecuado.

Pero suponiendo que lo escriba correctamente y su espacio de nombres y organice sus archivos de la misma manera para cada proyecto, puede reutilizar su cargador automático. Es decir, lo escribes una vez y puedes usarlo en otros proyectos.

Pasos para un cargador automático

Al escribir un cargador automático, solo hay que seguir unos pocos pasos. El cargador automático tiene que ser capaz de responder a los siguientes archivos:

  1. ¿Dónde están los archivos?
  2. ¿Cómo se nombran?
  3. ¿Existe el archivo?

Si todo lo anterior es cierto (o puede responder "sí" a todos ellos), entonces el cargador automático hará lo que se supone que debe hacer.

Veremos un poco de código en un momento, pero lo primero que hay que tener en cuenta es que utiliza una función llamada spl_autoload_register.

SPL se refiere a la biblioteca PHP estándar, y la función acepta una función como argumento, y esa función acepta el nombre de la clase que se va a instanciar. Es más procedimental que orientado a objetos, y hablaré de esto en un momento, pero es importante tenerlo en cuenta al leer este código.

Aquí está la primera parte del código. Voy a explicar lo que está haciendo después del hecho:

Espacios de nombres y carga automática en WordPress

Carga automática, parte 1: encontrar la clase

En esta parte del código, la función recibe el nombre completo de la clase de la que se va a crear una instancia (como "WCATLFileFileReader()").

A continuación, separa todas las partes del nombre completo en partes. El nombre de la clase es el último índice de la matriz, y opto por nombrar mis archivos como "class-filereader.php" para que la función cree una variable, $class_file, que hace referencia al nombre del archivo.

Pero aún no hemos terminado. Todavía tenemos que obtener el nombre completo (es decir, dónde se encuentra el archivo en el disco). Esto podría parecerse a esto:

Espacios de nombres y carga automática en WordPress

Carga automática, parte 2: obtener el nombre completo

En este punto, preparamos una variable, $fully_qualified_path, que hará referencia al directorio de nivel superior.

A continuación, el código itera a través de todos los índices de la matriz y crea una ruta para el archivo de clase. Puede imaginar esto como construir una cadena como "wcatlfile" que luego combinamos con $class_file.

Esto significa que la ruta completa al archivo se convierte en "wcatlfileclass-filereader.php".

Y finalmente, incluimos el archivo. Tenga en cuenta que este código no está comprobando si el archivo existe. Aunque lo recomiendo, se ha omitido por razones de longitud y porque, en nuestro ejemplo, sabemos que el archivo existe.

Si el archivo no existe, hay varias opciones:

  1. Lanzar una excepción,
  2. Atrapa una excepción,
  3. Mostrar un mensaje de error propio,
  4. O alguna otra opción que pueda estar considerando en este artículo.

Independientemente, la idea es estar a la defensiva en su código para que pueda prepararse para el caso de que un archivo no exista y pueda manejar la falla con gracia.

en carga automática

Antes de concluir, es importante tener en cuenta lo siguiente:

  • A lo largo del ejemplo, hemos estado usando código orientado a objetos al asignar espacios de nombres al código. Después de todo, es un concepto orientado a objetos.
  • Nuestro cargador automático está escrito en código de procedimiento. ¿Lo que da?

En última instancia, esto tiene que ver con la biblioteca estándar de PHP. Puede escribir un cargador automático orientado a objetos, pero creo que es un poco exagerado en muchos casos.

El proceso de carga de un archivo es un proceso paso a paso, por lo que escribirlo de manera procesal es una opción natural.

Finalmente, otros pueden optar por usar herramientas como Composer para incorporar dependencias. Estas son excelentes herramientas, y hay muchas ventajas al usar algo como esto; sin embargo, está más allá de los conceptos y temas de este artículo y es mejor dejarlo para una charla futura.

Recursos (¡y gracias!)

Este ha sido uno de los artículos más largos que he escrito para mi sitio.

Esto se debe en parte a que se basa en una charla para WordCamp y también porque quiero asegurarme de proporcionar una introducción y una base sólidas donde puede comenzar a incorporar espacios de nombres y carga automática en sus complementos de WordPress.

Además de este artículo, también proporcioné los siguientes recursos:

Y con eso, espero que esto proporcione una introducción sólida a los espacios de nombres y la carga automática y que pueda comenzar a incorporar esto cada vez más en su trabajo. Beneficia enormemente su trabajo y el de otros desarrolladores que también pueden terminar usando su trabajo.

Fuente de grabación: tommcfarlin.com

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More