Eu realmente não tenho certeza se é uma boa ou má prática carregar automaticamente classes no plug-in WP. Para mim, não vejo efeitos colaterais do uso spl_autoload_register
(desempenho não testado)
Então, para responder à sua pergunta, gostaria de compartilhar uma classe do meu próximo plug-in que estou usando para carregar automaticamente classes de um único diretório sem problemas e isso faz bem a mim até agora.
/**
* 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 quebrar essa classe simples em partes, como você vê, estou usando o padrão Singleton. Constructor
é privado e instance()
& $_instance
pertence ao padrão. Construtor tem spl_autoload_register
função.
spl_autoload_register( array( $this, 'load' ) );
que está chamando o load
método da auto-classe. As duas primeiras linhas desse método são:
$file = str_replace( '_', '-', strtolower( $class_name ) );
$file = 'class-' . $file;
o que é bem direto. se você seguir o WPCS , o incentivará a seguir uma convenção de nomenclatura de classe prefixada com a palavra classe e depois o nome da classe. é claro que qualquer sublinhado (_) é substituído por (-) traço.
então um nome de arquivo da classe WPSE_Post
seriaclass-wpse-post.php
Nomes de classes de caixa inferior com strtolower
e usando str_replace
para substituir sublinhados por traços. então WPSE_Post
agora se torna wpse-post
. finalmente adicionando um prefixo class-
na próxima linha.
Eu estou usando is_readable
na declaração condicional que é permutável com file_exists
. assumindo que YOUR_PLUGIN_PATH
é o caminho base do plug-in e classes-dir
está sob o diretório principal do plug-in, mantendo todas as suas classes que precisam de carregamento automático.
include_once
é usado para carregar o arquivo real de plantão.
Uso:
você só precisa incluir a classe auto loader acima no arquivo base do seu plugin
/**
* Class autoloader.
*/
if ( ! class_exists( 'Annframe_Autoloader' ) ) {
include_once YOUR_PLUGIN_PATH/class-annframe-autoloader.php';
}
e depois ligue para suas aulas sob demanda.
new XYX_Class();
Another_Class::instance(); // etc
Nota: Não estou usando o método de espaço para nome na minha solução, para que ele possa ou não se adequar às suas necessidades, mas publicado aqui na esperança de que alguém pelo menos obtenha benefícios de carregar classes dinamicamente.
spl_autoload_register()
sem efeitos colaterais negativos.