{"id":228892,"date":"2022-10-29T09:06:00","date_gmt":"2022-10-29T06:06:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228892"},"modified":"2022-11-09T04:41:03","modified_gmt":"2022-11-09T01:41:03","slug":"espacios-de-nombres-y-carga-automatica-en-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/espacios-de-nombres-y-carga-automatica-en-wordpress\/","title":{"rendered":"Espacios de nombres y carga autom\u00e1tica en WordPress"},"content":{"rendered":"\n<p>La semana pasada, hice mi presentaci\u00f3n en <a href=\"https:\/\/2017.atlanta.wordcamp.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordCamp Atlanta<\/a> sobre espacios de nombres y carga autom\u00e1tica. (el t\u00edtulo completo era Espacios de nombres, carga autom\u00e1tica y mejora de la arquitectura de complementos, pero eso es un bocado, \u00bfno?)<\/p>\n<p>Debido a la naturaleza de la charla, opt\u00e9 por escribir una publicaci\u00f3n para acompa\u00f1ar la publicaci\u00f3n, compartir las diapositivas y compartir un complemento de ejemplo de GitHub para ayudar a respaldar la charla.<\/p>\n<p>Entonces, si asistieron, gracias (!) Y aqu\u00ed est\u00e1 la publicaci\u00f3n, lo promet\u00ed. Y para aquellos de ustedes que no asistieron, espero que esta publicaci\u00f3n a\u00fan ayude a demostrar los conceptos y temas <a href=\"https:\/\/tommcfarlin.com\/wordcamp-atlanta-2017\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">que discut\u00ed en WordCamp<\/a>.<\/p>\n<h2>Espacios de nombres y carga autom\u00e1tica<\/h2>\n<p>Antes de hablar sobre los espacios de nombres y la carga autom\u00e1tica en WordPress, la raz\u00f3n por la que quiero hablar sobre esto es porque puede afectar directamente la calidad de su c\u00f3digo y puede hacerlo durante los pr\u00f3ximos meses y a\u00f1os.<\/p>\n<p>Despu\u00e9s de todo, muchos de nosotros, los desarrolladores, ya no hacemos la pregunta:<\/p>\n<blockquote>\n<p>\u00bfC\u00f3mo podemos hacer que nuestro c\u00f3digo sea mejor de lo que ya es?<\/p>\n<\/blockquote>\n<p>Y muchos de nosotros somos lo suficientemente inteligentes como para saber lo que no sabemos. As\u00ed que nos enfrentamos a trabajar dentro de las limitaciones que nos dan.<\/p>\n<p>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.<\/p>\n<p>Pero como sabemos lo que no sabemos, sabemos que hay potencial para m\u00e1s.<\/p>\n<h3>Primero, su c\u00f3digo<\/h3>\n<p>Cuando se trata de hablar sobre temas como los espacios de nombres y la carga autom\u00e1tica en el contexto de WordPress, creo que a menudo nos encontramos con respuestas mixtas.<\/p>\n<p>Despu\u00e9s de todo, podr\u00edamos estar hablando de cosas como <a href=\"https:\/\/codex.wordpress.org\/Theme_Customization_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">el personalizador de temas<\/a> o la <a href=\"https:\/\/developer.wordpress.org\/rest-api\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">API REST<\/a> o algo m\u00e1s divertido.<\/p>\n<p>Quiero decir, &quot;espacios de nombres y carga autom\u00e1tica&quot; simplemente no suena emocionante o avanzado cuando se compara con las caracter\u00edsticas y tecnolog\u00edas m\u00e1s nuevas que est\u00e1n disponibles, \u00bfverdad?<\/p>\n<p>Pero no, no son realmente aburridos. Y a trav\u00e9s de esta publicaci\u00f3n y la presentaci\u00f3n y el c\u00f3digo fuente que la acompa\u00f1an, les mostrar\u00e9 por qu\u00e9 y c\u00f3mo no lo son.<\/p>\n<h4>no son aburridos<\/h4>\n<p>Creo que es justo decir que los desarrolladores, al menos una parte de nosotros o una parte de ellos, dependiendo de c\u00f3mo te veas a ti mismo, son conocidos por discutir sobre aspectos de la programaci\u00f3n.<\/p>\n<p>&quot;Conversaci\u00f3n aburrida de todos modos&quot;.<\/p>\n<p>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\u00f1o conjunto de bases de datos a pesar de que tenemos procesadores de cuatro n\u00facleos y 16 GB de RAM. en nuestras m\u00e1quinas de escritorio.<\/p>\n<p>Entonces, si nos preocupamos tanto por algo tan peque\u00f1o, seguramente nos preocupamos por el panorama general. Cosas como:<\/p>\n<ul>\n<li>C\u00f3digo mejorado<\/li>\n<li>Mejor organizaci\u00f3n<\/li>\n<li>Mayor mantenibilidad<\/li>\n<li>Depuraci\u00f3n m\u00e1s f\u00e1cil<\/li>\n<li>Ganar m\u00e1s dinero (bueno, tal vez).<\/li>\n<\/ul>\n<p>Y los espacios de nombres y la carga autom\u00e1tica pueden conducir directamente a todo lo anterior (bueno, no puedo hablar de dinero, pero tiene potencial).<\/p>\n<p>Si tuviera que resumir los espacios de nombres de roles y el lugar de carga autom\u00e1tica en todo lo anterior, dir\u00eda que:<\/p>\n<p>Los espacios de nombres y la carga autom\u00e1tica conducen a un c\u00f3digo mejorado a trav\u00e9s de una mejor organizaci\u00f3n, compartimentaci\u00f3n o modularizaci\u00f3n, y una relaci\u00f3n m\u00e1s estrecha a trav\u00e9s de sus conceptos.<\/p>\n<p>Adem\u00e1s, esto aumenta la capacidad de mantenimiento porque el c\u00f3digo se organiza en paquetes, lo que puede facilitar la depuraci\u00f3n a medida que crece el producto.<\/p>\n<p>Todo esto puede conducir a un ahorro de tiempo o un mejor uso del tiempo, lo que, seg\u00fan su modelo de negocio, puede afectar sus resultados.<\/p>\n<p>Pero esto todav\u00eda no describe ninguna de estas cosas. Pero seguramente, en este punto, suenan m\u00e1s interesantes que cuando se presentaron por primera vez.<\/p>\n<h4>Entonces, \u00bfqu\u00e9 son?<\/h4>\n<p>Antes de entrar en las definiciones de cada uno y las funciones que desempe\u00f1an, echemos un vistazo a c\u00f3mo la falta de espacios de nombres y la carga autom\u00e1tica en WordPress ha afectado negativamente su experiencia al usar temas, complementos, complementos o cualquier otra cosa que tenga.<\/p>\n<p>As\u00ed que retrocedamos por un momento y veamos cada uno de ellos individualmente.<\/p>\n<h5>Espacios de nombres<\/h5>\n<p>Imagina que has heredado un proyecto y est\u00e1s a punto de empezar a trabajar en \u00e9l. Digamos que es un complemento de WordPress.<\/p>\n<p>Lo instalas; vas a activarlo y luego te dan al menos uno de estos:<\/p>\n<ul>\n<li>Tal vez vea ese desagradable mensaje de organizaci\u00f3n en la parte superior de la ventana del navegador que muestra un seguimiento de la pila.<\/li>\n<li>Tal vez vea un mensaje que habla de alg\u00fan conflicto con otro paquete existente.<\/li>\n<li>O tal vez cuando intenta activar un complemento, la p\u00e1gina se actualiza pero el complemento no se activa.<\/li>\n<li>Tal vez incluso haya realizado una auditor\u00eda de c\u00f3digo y vea comprobaciones de class_exists en todo el c\u00f3digo base.<\/li>\n<\/ul>\n<p>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.<\/p>\n<p>Es decir, la raz\u00f3n por la que est\u00e1 experimentando estos problemas es que el c\u00f3digo con el que est\u00e1 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\u00f3dulos con el mismo nombre. .<\/p>\n<p>Pero cuando asignas un espacio de nombres a algo, le das su \u00e1rea relativa a s\u00ed misma que seguir\u00e1 funcionando bien con otros componentes, incluso si tienen el mismo nombre de clase.<\/p>\n<h5>Cargadores autom\u00e1ticos<\/h5>\n<p>En lo que respecta a los cargadores autom\u00e1ticos, son un poco menos complicados en algunos aspectos. Primero, piensa en el c\u00f3digo que escribes o el c\u00f3digo con el que trabajas, especialmente en el contexto de los complementos de WordPress, y luego piensa en cu\u00e1ntas veces escribes o ves lo siguiente:<\/p>\n<ul>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.include.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">incluir<\/a><\/li>\n<li>incluir_una vez<\/li>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.require.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">requerir<\/a><\/li>\n<li>requerir una vez<\/li>\n<\/ul>\n<p>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\u00f3digo base.<\/p>\n<p>Si todos est\u00e1n contenidos en un solo archivo, eso no es tan malo porque al menos sabes d\u00f3nde est\u00e1n. Pero si est\u00e1n esparcidos por todas partes, entonces no tiene idea de d\u00f3nde se est\u00e1 introduciendo una dependencia en el sistema.<\/p>\n<p>La carga autom\u00e1tica puede resolver todo esto cargando las dependencias cuando sea necesario (y para aquellos que est\u00e9n interesados, la carga autom\u00e1tica es m\u00e1s r\u00e1pida que la inclusi\u00f3n manual).<\/p>\n<h2>Espacios de nombres<\/h2>\n<p>Dicho todo esto, estamos listos para hablar sobre los espacios de <a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">nombres<\/a> y la carga autom\u00e1tica. Pero los espacios de nombres son el concepto fundamental, as\u00ed que empezaremos por ah\u00ed.<\/p>\n<p>Pero despu\u00e9s de todo lo anterior, puedes ver las ventajas de usarlos. Tal vez incluso son divertidos, \u00bfverdad? \u00bfQuiz\u00e1s?<\/p>\n<p>Independientemente, necesitamos una definici\u00f3n a partir de la cual podamos trabajar cuando hablemos de esto durante el resto del art\u00edculo.<\/p>\n<p>El manual de PHP <a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.rationale.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">proporciona la siguiente definici\u00f3n<\/a> :<\/p>\n<blockquote>\n<p>Los espacios de nombres est\u00e1n dise\u00f1ados para resolver dos problemas que encuentran los autores de bibliotecas y aplicaciones al crear elementos de c\u00f3digo reutilizables, como clases o funciones&#8230;<\/p>\n<\/blockquote>\n<p>Y eso no est\u00e1 mal, pero es bastante largo, t\u00e9cnico y puede ser demasiado para aquellos que reci\u00e9n comienzan. As\u00ed que vamos a simplificarlo un poco para este art\u00edculo:<\/p>\n<p>\u00bfUn poco mejor, tal vez?<\/p>\n<blockquote>\n<p>Una forma de agrupar clases e interfaces relacionadas que tienen un prop\u00f3sito similar.<\/p>\n<\/blockquote>\n<p>No voy a hablar de interfaces en esta charla; sin embargo, s\u00e9 que hay desarrolladores orientados a objetos de nivel intermedio que los usan, as\u00ed que quer\u00eda asegurarme de mencionarlos al menos.<\/p>\n<h3>Un ejemplo pr\u00e1ctico<\/h3>\n<p>No me gustan los ejemplos de programaci\u00f3n que no ofrecen aplicaciones pr\u00e1cticas o del mundo real. A menudo, se nos dan ejemplos de cosas que nunca codificar\u00edamos.<\/p>\n<p>\u00bfCu\u00e1ntas veces ha le\u00eddo un art\u00edculo orientado a objetos y da un ejemplo de una clase de animal o una clase de autom\u00f3vil? No vamos a estar programando un auto.<\/p>\n<p>Es mucho m\u00e1s probable que trabajemos con archivos. As\u00ed 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\u00f3n de las responsabilidades que mantienen.<\/p>\n<p>Y s\u00ed, puede tener interfaces; sin embargo, est\u00e1n fuera del alcance de este art\u00edculo, por lo que no se incluir\u00e1n.<\/p>\n<p>Entonces, para nuestro FileReader, quiz\u00e1s los conceptos b\u00e1sicos de la clase se vean as\u00ed:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1413b1bb.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1413b1bb.jpg\" alt=\"Espacios de nombres y carga autom\u00e1tica en WordPress\" ><\/a><\/p>\n<p>Una clase para leer archivos.<\/p>\n<p>Observe que la funci\u00f3n acepta el nombre del archivo que deber\u00eda abrir para leer. La comprobaci\u00f3n de errores, c\u00f3mo lee el archivo y lo que devuelve depende de la implementaci\u00f3n de la clase.<\/p>\n<p>Y para FileWriter, tenemos algo como esto:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a143c699f.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a143c699f.jpg\" alt=\"Espacios de nombres y carga autom\u00e1tica en WordPress\" ><\/a><\/p>\n<p>Una clase para escribir archivos.<\/p>\n<p>Esta clase, por otro lado, acepta la informaci\u00f3n que va a escribir en el disco y el nombre del archivo en el que debe escribirse.<\/p>\n<p>Una vez m\u00e1s, como en el ejemplo anterior, no incluye la verificaci\u00f3n de errores, la escritura a trav\u00e9s de un recurso, el cierre de los recursos, etc.<\/p>\n<p>Pero esto no se trata de trabajar con archivos. En su lugar, se trata de mostrar c\u00f3mo asignar un espacio de nombres a su c\u00f3digo, y estos dos ejemplos est\u00e1n destinados a ser fundamentales para eso.<\/p>\n<h3>Notas sobre los espacios de nombres<\/h3>\n<p>Hay una advertencia sobre lo que ve en las im\u00e1genes del c\u00f3digo 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.<\/p>\n<p>M\u00edralo de esta manera: imagina que empaquetas este c\u00f3digo en un complemento para otra persona, y luego cargan otro complemento que tambi\u00e9n funciona como FileReader o FileWriter. Dado que todo formar\u00e1 parte del mismo espacio de <a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.global.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">nombres global<\/a>, se enfrentar\u00e1 a un conflicto.<\/p>\n<p>Recuerda:<\/p>\n<blockquote>\n<p>Los espacios de nombres son una forma de agrupar clases e interfaces relacionadas que tienen un prop\u00f3sito similar.<\/p>\n<\/blockquote>\n<p>As\u00ed que tomemos las clases y el espacio de nombres del c\u00f3digo.<\/p>\n<p>Primero, proporcionaremos un espacio de nombres de nivel superior bajo el cual residir\u00e1n estas clases y todas las dem\u00e1s clases; luego proporcionaremos un subpaquete (o subespacio de nombres o subespacio como los he o\u00eddo llamar) en el que residir\u00e1n estas clases de archivos.<\/p>\n<p>Esto significa que nuestro FileReader ahora se ver\u00e1 as\u00ed:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a146586f4.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a146586f4.jpg\" alt=\"Espacios de nombres y carga autom\u00e1tica en WordPress\" ><\/a><\/p>\n<p>Una clase con espacio de nombres para leer archivos.<\/p>\n<p>Y nuestro FileWriter ahora se ver\u00e1 as\u00ed:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1487e5b2.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1487e5b2.jpg\" alt=\"Espacios de nombres y carga autom\u00e1tica en WordPress\" ><\/a><\/p>\n<p>Una clase con espacio de nombres para escribir archivos.<\/p>\n<p>Primero, puede ver que usar espacios de nombres es f\u00e1cil: simplemente use la palabra clave del espacio de nombres y luego declare el espacio de nombres (que podr\u00eda ser WCATL f\u00e1cilmente) en la parte superior con los subpaquetes a continuaci\u00f3n.<\/p>\n<p>Pero esto lleva a otros temas, a saber, sobre la organizaci\u00f3n de archivos, la creaci\u00f3n de instancias y la carga autom\u00e1tica, todos los cuales vale la pena cubrir.<\/p>\n<h3>Organizaci\u00f3n en archivo<\/h3>\n<p>En este punto, es importante tener una palabra sobre la organizaci\u00f3n de archivos. Dependiendo de con qui\u00e9n hable, encontrar\u00e1 que algunos desarrolladores, sorpresa, sorpresa, tienen una opini\u00f3n sobre c\u00f3mo deben organizarse los archivos (y yo no soy diferente).<\/p>\n<p>Por un lado, no tienes que organizar tus archivos en absoluto. De hecho, puede colocar cada cosa en el directorio ra\u00edz de su proyecto, asignar un espacio de nombre a la informaci\u00f3n y estar listo para comenzar.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a14ab117d.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a14ab117d.jpg\" alt=\"Espacios de nombres y carga autom\u00e1tica en WordPress\" ><\/a><\/p>\n<p>Archivos no organizados<\/p>\n<p>El conjunto de archivos anterior es para un proyecto peque\u00f1o, por lo que puede imaginar cu\u00e1ntos archivos existir\u00edan para un proyecto grande.<\/p>\n<p>Pero cuando tiene sus archivos organizados de esta manera, puede hacer que escribir un autocargador sea un poco dif\u00edcil porque un autocargador necesita saber d\u00f3nde encontrar los archivos seg\u00fan su espacio de nombres.<\/p>\n<p>Aqu\u00ed es donde entran en juego los t\u00e9rminos \u00aborganizaci\u00f3n l\u00f3gica&quot; y \u00aborganizaci\u00f3n virtual\u00bb.<\/p>\n<ul>\n<li>Organizaci\u00f3n l\u00f3gica se refiere a c\u00f3mo se organizan los archivos en el disco, como lo que ve arriba. Est\u00e1n ubicados l\u00f3gicamente en el directorio ra\u00edz.<\/li>\n<li>Organizaci\u00f3n virtual se refiere a c\u00f3mo 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.<\/li>\n<\/ul>\n<p>Entonces, si tomara el proyecto anterior, sus espacios de nombres, sus subpaquetes y luego los organizara de manera l\u00f3gica y virtual, se ver\u00eda as\u00ed:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a14d9a198.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a14d9a198.jpg\" alt=\"Espacios de nombres y carga autom\u00e1tica en WordPress\" ><\/a><\/p>\n<p>Espacios de nombres y carga autom\u00e1tica: archivos organizados<\/p>\n<p>Y aunque puedes optar por organizar tus archivos como quieras, soy fan\u00e1tico de asegurarme de que haya paridad entre los dos. Es decir, me gusta que mi organizaci\u00f3n l\u00f3gica y virtual coincidan como se ve en la imagen de arriba.<\/p>\n<p>A medida que avance en la discusi\u00f3n de la carga autom\u00e1tica, ver\u00e1 por qu\u00e9 esto es importante.<\/p>\n<h2>Notas sobre los espacios de nombres<\/h2>\n<p>Sin embargo, \u00bfqu\u00e9 sucede cuando necesitamos crear instancias de clases que tienen espacios de nombres? Cuando las clases no tienen espacios de nombres, es f\u00e1cil usar la palabra clave &#8216;nuevo&#8217;.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a14f8414e.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a14f8414e.jpg\" alt=\"Espacios de nombres y carga autom\u00e1tica en WordPress\" ><\/a><\/p>\n<p>Creaci\u00f3n de instancias sin un espacio de nombres.<\/p>\n<p>Pero tenemos que instanciar una clase con espacio de nombres, tenemos que ir un paso m\u00e1s all\u00e1 y usar el nombre completo:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1519c7ff.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1519c7ff.jpg\" alt=\"Espacios de nombres y carga autom\u00e1tica en WordPress\" ><\/a><\/p>\n<p>Espacios de nombres y carga autom\u00e1tica: creaci\u00f3n de instancias con un espacio de nombres.<\/p>\n<p>Pero esto se vuelve engorroso, \u00bfno? Este ejemplo en particular no es tan malo, pero imagina que estuvieras trabajando en algo con m\u00e1s subpaquetes. Ser\u00eda bastante engorroso, \u00bfno?<\/p>\n<p>Para ese fin, podemos usar lo que se llama aliasing. Es simple, tambi\u00e9n. Podemos definir el uso de la palabra clave &#8216;use&#8217; en la parte superior del archivo para referirnos al espacio de nombres que queremos alias y luego usar el \u00faltimo subpaquete como parte del alias para instanciar nuestra clase.<\/p>\n<p>Suena confuso, \u00bfno? Tal vez verlo en acci\u00f3n ayude:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1541531b.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1541531b.jpg\" alt=\"Espacios de nombres y carga autom\u00e1tica en WordPress\" ><\/a><\/p>\n<p>Espacios de nombres de alias.<\/p>\n<p>Y eso es todo lo que hay que hacer. S\u00ed, puede <a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.importing.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">llevar el alias un paso m\u00e1s all\u00e1<\/a>, pero esto es todo lo que estoy tomando en el contexto de este art\u00edculo.<\/p>\n<h2>Carga autom\u00e1tica<\/h2>\n<p>En este punto, tenemos las bases sentadas para la carga autom\u00e1tica. S\u00ed, trabajar con espacios de nombres puede ser mucho trabajo si no est\u00e1 acostumbrado; sin embargo, es importante entenderlo porque la carga autom\u00e1tica requiere un poco de trabajo que puede ser inesperado si nunca antes lo ha presentado.<\/p>\n<p>Independientemente, las cosas m\u00e1s importantes para recordar con respecto a los espacios de nombres, en este punto, son:<\/p>\n<ol>\n<li>Los espacios de nombres son una forma de agrupar clases e interfaces relacionadas que tienen un prop\u00f3sito similar.<\/li>\n<li>Cree paridad a trav\u00e9s de sus archivos y espacios de nombres asegur\u00e1ndose de que su organizaci\u00f3n l\u00f3gica y virtual sean iguales.<\/li>\n<\/ol>\n<p>Y ahora es el momento de ver la carga autom\u00e1tica.<\/p>\n<h3>Notas sobre la carga autom\u00e1tica<\/h3>\n<p>Primero, veamos la definici\u00f3n de carga autom\u00e1tica proporcionada <a href=\"https:\/\/php.net\/manual\/en\/language.oop5.autoload.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">por el manual de PHP<\/a> :<\/p>\n<blockquote>\n<p>La funci\u00f3n spl_autoload_register() registra cualquier cantidad de cargadores autom\u00e1ticos, lo que permite que las clases y las interfaces se carguen autom\u00e1ticamente si no est\u00e1n definidas actualmente. Al registrar cargadores autom\u00e1ticos, PHP tiene la \u00faltima oportunidad de cargar la clase o la interfaz antes de que falle con un error.<\/p>\n<\/blockquote>\n<p>No est\u00e1 mal. Aunque es largo. Entonces, tal como hicimos con los espacios de nombres, usemos una definici\u00f3n m\u00e1s corta para este art\u00edculo:<\/p>\n<blockquote>\n<p>Una forma de cargar autom\u00e1ticamente interfaces y clases sin usar declaraciones include y require.<\/p>\n<\/blockquote>\n<p>Nuevamente, no usaremos interfaces en este art\u00edculo, aunque algunos desarrolladores s\u00ed lo hacen. Y eso proporcionar\u00e1 la definici\u00f3n de trabajo para el resto de este art\u00edculo.<\/p>\n<h3>Un ejemplo pr\u00e1ctico<\/h3>\n<p>Una vez que tenga sus archivos organizados, con espacios de nombres y listos para cargar, entonces es hora de hacer precisamente eso, \u00bfverdad? Quiero decir:<\/p>\n<ol>\n<li>sus archivos est\u00e1n organizados,<\/li>\n<li>est\u00e1s listo para cargarlos<\/li>\n<\/ol>\n<p>As\u00ed que es hora de hacerlo autom\u00e1ticamente, \u00bfverdad? Pero hay una trampa. Todos los archivos de &quot;carga autom\u00e1tica&quot; requieren un poco de trabajo.<\/p>\n<h3>Escribir un cargador autom\u00e1tico<\/h3>\n<p>Es decir, es autom\u00e1tico, pero a\u00fan requiere un poco m\u00e1s de trabajo por nuestra parte. Antes de entrar en esos pasos, es importante tener en cuenta:<\/p>\n<ol>\n<li>no est\u00e1 totalmente automatizado,<\/li>\n<li>tenemos que escribirlo.<\/li>\n<\/ol>\n<p>Tan bueno como ser\u00eda tener el c\u00f3digo cargado autom\u00e1ticamente, tenemos que leer algunos datos, analizarlos y luego intentar cargar el archivo adecuado.<\/p>\n<p>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\u00e1tico. Es decir, lo escribes una vez y puedes usarlo en otros proyectos.<\/p>\n<h3>Pasos para un cargador autom\u00e1tico<\/h3>\n<p>Al escribir un cargador autom\u00e1tico, solo hay que seguir unos pocos pasos. El cargador autom\u00e1tico tiene que ser capaz de responder a los siguientes archivos:<\/p>\n<ol>\n<li>\u00bfD\u00f3nde est\u00e1n los archivos?<\/li>\n<li>\u00bfC\u00f3mo se nombran?<\/li>\n<li>\u00bfExiste el archivo?<\/li>\n<\/ol>\n<p>Si todo lo anterior es cierto (o puede responder &quot;s\u00ed&quot; a todos ellos), entonces el cargador autom\u00e1tico har\u00e1 lo que se supone que debe hacer.<\/p>\n<p>Veremos un poco de c\u00f3digo en un momento, pero lo primero que hay que tener en cuenta es que utiliza una funci\u00f3n llamada spl_autoload_register.<\/p>\n<p>SPL se refiere a <a href=\"https:\/\/php.net\/manual\/en\/book.spl.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la biblioteca PHP est\u00e1ndar<\/a>, y la funci\u00f3n acepta una funci\u00f3n como argumento, y esa funci\u00f3n acepta el nombre de la clase que se va a instanciar. Es m\u00e1s procedimental que orientado a objetos, y hablar\u00e9 de esto en un momento, pero es importante tenerlo en cuenta al leer este c\u00f3digo.<\/p>\n<p>Aqu\u00ed est\u00e1 la primera parte del c\u00f3digo. Voy a explicar lo que est\u00e1 haciendo despu\u00e9s del hecho:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1562a1b8.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1562a1b8.jpg\" alt=\"Espacios de nombres y carga autom\u00e1tica en WordPress\" ><\/a><\/p>\n<p>Carga autom\u00e1tica, parte 1: encontrar la clase<\/p>\n<p>En esta parte del c\u00f3digo, la funci\u00f3n recibe el nombre completo de la clase de la que se va a crear una instancia (como &quot;WCATLFileFileReader()&quot;).<\/p>\n<p>A continuaci\u00f3n, separa todas las partes del nombre completo en partes. El nombre de la clase es el \u00faltimo \u00edndice de la matriz, y opto por nombrar mis archivos como &quot;class-filereader.php&quot; para que la funci\u00f3n cree una variable, $class_file, que hace referencia al nombre del archivo.<\/p>\n<p>Pero a\u00fan no hemos terminado. Todav\u00eda tenemos que obtener el nombre completo (es decir, d\u00f3nde se encuentra el archivo en el disco). Esto podr\u00eda parecerse a esto:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a15910c7c.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a15910c7c.jpg\" alt=\"Espacios de nombres y carga autom\u00e1tica en WordPress\" ><\/a><\/p>\n<p>Carga autom\u00e1tica, parte 2: obtener el nombre completo<\/p>\n<p>En este punto, preparamos una variable, $fully_qualified_path, que har\u00e1 referencia al directorio de nivel superior.<\/p>\n<p>A continuaci\u00f3n, el c\u00f3digo itera a trav\u00e9s de todos los \u00edndices de la matriz y crea una ruta para el archivo de clase. Puede imaginar esto como construir una cadena como &quot;wcatlfile&quot; que luego combinamos con $class_file.<\/p>\n<p>Esto significa que la ruta completa al archivo se convierte en &quot;wcatlfileclass-filereader.php&quot;.<\/p>\n<p>Y finalmente, incluimos el archivo. Tenga en cuenta que este c\u00f3digo no est\u00e1 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.<\/p>\n<p>Si el archivo no existe, hay varias opciones:<\/p>\n<ol>\n<li>Lanzar una excepci\u00f3n,<\/li>\n<li>Atrapa una excepci\u00f3n,<\/li>\n<li>Mostrar un mensaje de error propio,<\/li>\n<li>O alguna otra opci\u00f3n que pueda estar considerando en este art\u00edculo.<\/li>\n<\/ol>\n<p>Independientemente, la idea es estar a la defensiva en su c\u00f3digo para que pueda prepararse para el caso de que un archivo no exista y pueda manejar la falla con gracia.<\/p>\n<h3>en carga autom\u00e1tica<\/h3>\n<p>Antes de concluir, es importante tener en cuenta lo siguiente:<\/p>\n<ul>\n<li>A lo largo del ejemplo, hemos estado usando c\u00f3digo orientado a objetos al asignar espacios de nombres al c\u00f3digo. Despu\u00e9s de todo, es un concepto orientado a objetos.<\/li>\n<li>Nuestro cargador autom\u00e1tico est\u00e1 escrito en c\u00f3digo de procedimiento. \u00bfLo que da?<\/li>\n<\/ul>\n<p>En \u00faltima instancia, esto tiene que ver con la biblioteca est\u00e1ndar de PHP. Puede escribir un cargador autom\u00e1tico orientado a objetos, pero creo que es un poco exagerado en muchos casos.<\/p>\n<p>El proceso de carga de un archivo es un proceso paso a paso, por lo que escribirlo de manera procesal es una opci\u00f3n natural.<\/p>\n<p>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\u00e1 m\u00e1s all\u00e1 de los conceptos y temas de este art\u00edculo y es mejor dejarlo para una charla futura.<\/p>\n<h2>Recursos (\u00a1y gracias!)<\/h2>\n<p>Este ha sido uno de los art\u00edculos m\u00e1s largos que he escrito para mi sitio.<\/p>\n<p>Esto se debe en parte a que se basa en una charla para WordCamp y tambi\u00e9n porque quiero asegurarme de proporcionar una introducci\u00f3n y una base s\u00f3lidas donde puede comenzar a incorporar espacios de nombres y carga autom\u00e1tica en sus complementos de WordPress.<\/p>\n<p>Adem\u00e1s de este art\u00edculo, tambi\u00e9n proporcion\u00e9 los siguientes recursos:<\/p>\n<ul>\n<li>Las diapositivas de mi presentaci\u00f3n est\u00e1n <a href=\"https:\/\/speakerdeck.com\/tommcfarlin\/namespaces-and-autoloading-improving-wordpress-plugin-architecture\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">disponibles en SpeakerDeck<\/a>.<\/li>\n<li>Tengo el c\u00f3digo de esta presentaci\u00f3n disponible <a href=\"https:\/\/github.com\/tommcfarlin\/namespaces-and-autoloading-in-wordpress\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">para descargar en GitHub<\/a>.<\/li>\n<\/ul>\n<p>Y con eso, espero que esto proporcione una introducci\u00f3n s\u00f3lida a los espacios de nombres y la carga autom\u00e1tica y que pueda comenzar a incorporar esto cada vez m\u00e1s en su trabajo. Beneficia enormemente su trabajo y el de otros desarrolladores que tambi\u00e9n pueden terminar usando su trabajo.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Basado en mi charla en WordCamp Atlanta 2017, este es mi art\u00edculo completo sobre espacios de nombres y carga autom\u00e1tica en el desarrollo de WordPress.<\/p>\n","protected":false},"author":1,"featured_media":221177,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,716,840,861],"tags":[1172],"class_list":["post-228892","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-tutoriales","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/228892","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=228892"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/228892\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/221177"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=228892"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=228892"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=228892"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}