Realmente no estoy seguro de si es una buena o mala práctica cargar automáticamente las clases en el complemento WP. Para mí, no veo efectos secundarios del uso spl_autoload_register
(rendimiento no probado)
Entonces, para responder a su pregunta, me gustaría compartir una clase de mi próximo complemento que estoy usando para cargar automáticamente las clases desde un solo directorio sin ningún problema y hasta ahora me ha ido bien.
/**
* Annframe Class Autoloader.
*
* @package Annframe
* @since 0.1.0
*/
class Annframe_Autoloader {
/**
* Singleton.
*
* @since 0.1.0
* @var Annframe_Autoloader - Single instance.
*/
private static $_instance = null;
/**
* Private Construct.
*
* @package Annframe
* @since 0.1.0
*/
private function __construct() {
spl_autoload_register( array( $this, 'load' ) );
}
/**
* Singleton method.
*
* @package Annframe
* @since 0.1.0
*/
public static function _instance() {
if ( ! self::$_instance ) {
self::$_instance = new Annframe_Autoloader();
}
return self::$_instance;
}
/**
* Class Loader.
*
* @package Annframe
* @since 0.1.0
*
* @param string $class_name - Class name to load.
* @return null - Do not return anything.
*/
public function load( $class_name ) {
$file = str_replace( '_', '-', strtolower( $class_name ) );
$file = 'class-' . $file;
if ( is_readable( trailingslashit( YOUR_PLUGIN_PATH. '/classes-dir' ) . $file . '.php' ) ) {
include_once trailingslashit( YOUR_PLUGIN_PATH. '/classes-dir' ) . $file . '.php';
}
return;
}
}
Annframe_Autoloader::_instance();
Para romper esta clase simple en partes como ves, estoy usando el patrón Singleton. Constructor
es privado y instance()
y $_instance
pertenece al patrón. El constructor tiene spl_autoload_register
función.
spl_autoload_register( array( $this, 'load' ) );
que es llamar al load
método de la auto clase. Las dos primeras líneas de este método son:
$file = str_replace( '_', '-', strtolower( $class_name ) );
$file = 'class-' . $file;
que es bastante directo si sigue WPCS, lo alienta a seguir una convención de nomenclatura de clase con el prefijo word class y luego el nombre de la clase. por supuesto, cualquier guión bajo (_) se reemplaza con un guión (-).
entonces un nombre de archivo de clase WPSE_Post
seríaclass-wpse-post.php
Menores nombres de clase de carcasa con strtolower
y usando str_replace
para reemplazar guiones bajos con guiones. así que WPSE_Post
ahora se hace wpse-post
. finalmente agregando un prefijo class-
en la siguiente línea.
Estoy usando una is_readable
declaración condicional que es intercambiable con file_exists
. asumiendo que YOUR_PLUGIN_PATH
es la ruta base del complemento y classes-dir
está bajo el directorio principal del complemento que contiene todas sus clases que necesitan carga automática.
include_once
se usa para cargar el archivo real en la llamada.
Uso:
solo necesita incluir la clase de cargador automático anterior en el archivo base de su complemento
/**
* Class autoloader.
*/
if ( ! class_exists( 'Annframe_Autoloader' ) ) {
include_once YOUR_PLUGIN_PATH/class-annframe-autoloader.php';
}
y luego llame a sus clases a pedido.
new XYX_Class();
Another_Class::instance(); // etc
Nota: No estoy utilizando el método de espacio de nombres en mi solución, por lo que puede o no ajustarse de acuerdo a sus necesidades, pero publicado aquí con la esperanza de que alguien obtenga al menos los beneficios de cargar clases dinámicamente.
spl_autoload_register()
sin efectos secundarios negativos.