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

Cómo implementar un cargador automático con espacios de nombres en su tema o complemento de WordPress

6

Si está escribiendo código orientado a objetos, un cargador automático es imprescindible. Sin un cargador automático, necesitaría agregar una línea que incluya el archivo de clase, antes de poder inicializarlo. Puede ser rápidamente engorroso cuando trabajas con muchas clases. Un cargador automático es una función que se activa cada vez que se crea una instancia de una nueva clase e incluye el archivo de clase antes de que ocurra la instanciación.

Los espacios de nombres son una forma de estructurar y encapsular su código y ayudan a evitar colisiones de nombres. Si va a escribir OOP, también se recomienda usar espacios de nombres. Tenga en cuenta que puede implementar un cargador automático sin usar espacios de nombres en su código OOP.

Puede usar este código para su tema o complemento de WordPress, o cualquier código PHP fuera de WordPress, solo modifique las rutas correspondientes. Para este ejemplo, estoy creando un cargador automático para un tema de WordPress.

Reglas para el espacio de nombres y la estructura de la clase

La implementación de un cargador automático requeriría algunas reglas definidas para la estructura de su código y dónde encontrarlas. El uso de espacios de nombres simplifica un poco esto, ya que su espacio de nombres puede hacer referencia a la carpeta en la que se encuentran las clases.

Primero tome una decisión sobre el nombre que debe tener su espacio de nombres. Por lo general, es algo único para su código, por ejemplo, el nombre de su tema. Por ejemplo, el espacio de nombres para el tema de este sitio es AWhitePixelTheme. Esto significa que para que funcione el cargador automático, cualquier clase debe estar dentro de este espacio de nombres.

namespace AWhitePixelTheme;

Mi primera regla es que cualquier archivo de clase siempre contendrá solo una clase y el nombre de la clase debe ser el mismo que el nombre del archivo. Por ejemplo; una clase MyTestdebe estar definida dentro de un archivo MyTest.php.

Mi segunda regla es cómo estructurar las clases en carpetas. Decido que todas las clases van dentro de una carpeta srcen mi tema. Puedo poner archivos de clase directamente en esta carpeta, y para eso deben estar dentro del espacio de nombres "raíz" definido anteriormente. Pero si quiero crear subcarpetas y poner archivos de clase en ellas, sus espacios de nombres deben incluir la estructura de carpetas. Por ejemplo, una clase archivo MyTest.phpque reside en la carpeta src/Test/, debe tener este espacio de nombres definido:

namespace AWhitePixelThemeTest;

Creación del cargador automático

Me gusta mantener el cargador automático en un archivo separado y fuera de la src/carpeta que está definida solo para archivos de clase con espacio de nombres. Como ejemplo, crearé un archivo autoloader.phpen la carpeta inc/de mi tema.

PHP tiene una función de cargador automático incorporada: spl_autoload_register. Proporcionas el nombre de la función del autocargador como parámetro, y en esa función obtienes la clase solicitada como argumento (lo que pones después newal instanciar la clase). Al crear instancias de clases con espacios de nombres, por ejemplo new AWhitePixelThemeTestMyTest(), la variable proporcionada para esta función sería "AWhitePixelThemeTestMyTest".

Agreguemos la función del cargador automático y en ella definimos nuestro espacio de nombres requerido para el cargador automático:

Luego, debemos incluir este archivo para que nuestro autocargador esté registrado. Como esto está en un tema, agregaré el include en el archivo functions.php. Si está utilizando esto para un complemento, colóquelo dentro de sus archivos de complemento. El archivo del autocargador debe agregarse temprano, antes de cualquier instanciación de clases. Estoy poniendo esto en la primera línea de mi functions.php:

require_once(get_template_directory(). '/inc/autoloader.php');

Si lo está utilizando para un tema secundario o un complemento, modifique la ruta según sus necesidades.

Y eso es. Ahora el cargador automático está en su lugar, pero no está haciendo nada. Volvamos a la función del cargador automático y terminémosla.

Escritura y prueba de la función del cargador automático

Primero, debemos asegurarnos de que el nombre de la clase solicitada esté realmente dentro de nuestro espacio de nombres. Simplemente verificamos si el nombre de la clase del espacio de nombres proporcionado contiene la cadena del espacio de nombres y, si no, salimos de la función. Después de eso, eliminamos el nombre del espacio de nombres de la cadena, para que podamos resolver cualquier subcarpeta y archivo de clase.

Ahora transformaremos el espacio de nombres proporcionado en una ruta real al archivo. Primero, reemplazaremos cualquier barra invertida ""en el espacio de nombres con el carácter de separador de carpetas; para esto, usamos la constante de PHP DIRECTORY_SEPARATOR. Al final añadimos un ".php". Y finalmente, antes de la cadena, agregamos la ruta raíz completa. Debido a que esto está dentro de un tema, estoy usando get_template_directory(). Si está usando esto para un complemento, use un método que devuelva la ruta completa a su complemento.

... $class = str_replace($namespace, '', $class);   $class = str_replace('', DIRECTORY_SEPARATOR, $class). '.php'; $directory = get_template_directory(); $path = $directory. DIRECTORY_SEPARATOR. 'src'. DIRECTORY_SEPARATOR. $class; }

Todo lo que tenemos que hacer ahora es verificar si el archivo existe y, si existe, solicitarlo.

... $path = $directory. DIRECTORY_SEPARATOR. 'src'. DIRECTORY_SEPARATOR. $class;   if (file_exists($path)) { require_once($path); } }

¡Eso es todo!

Vamos a probarlo. Cree una subcarpeta Testen la carpeta de su tema src/y dentro de ella coloque un archivo php llamado MyTest.php. Defina una clase MyTesten él, siguiendo las reglas para el espacio de nombres: AWhitePixelThemeTest. Solo agregaré una impresión de ‘Éxito’ en la función de construcción para que podamos ver fácilmente que realmente inicializa la clase.

En nuestro functions.php, después de solicitar el cargador automático, simplemente instanciamos la clase:

$test = new AWhitePixelThemeTestMyTest();

Actualice su sitio de WordPress y vea que obtiene el mensaje ‘¡Éxito!’ emitido.

El cargador automático cargará automáticamente cualquier archivo de clase que esté dentro de nuestro espacio de nombres definido y seguirá las reglas correctas. Puede crear instancias de clases desde cualquier lugar dentro de su tema, incluso dentro de las propias clases.

La función completa del cargador automático

Como referencia, aquí está nuestra última función de cargador automático:

spl_autoload_register('awhitepixel_autoloader'); function awhitepixel_autoloader($class) { $namespace = 'AWhitePixelTheme';   if (strpos($class, $namespace) !== 0) { return; }   $class = str_replace($namespace, '', $class); $class = str_replace('', DIRECTORY_SEPARATOR, $class). '.php';   $directory = get_template_directory(); $path = $directory. DIRECTORY_SEPARATOR. 'src'. DIRECTORY_SEPARATOR. $class;   if (file_exists($path)) { require_once($path); } }

Fuente de grabación: awhitepixel.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