Eu realmente não tenho certeza se é bom ou ruim praticar o carregamento automático de classes no plugin WP. Para mim, não vejo efeitos colaterais do uso de spl_autoload_register
(desempenho não testado)
Então, para responder à sua pergunta, eu gostaria de compartilhar uma classe do meu próximo plug-in que estou usando para carregar automaticamente as classes de um único diretório sem problemas e até agora isso é bom para mim.
/**
* 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ê pode ver, estou usando o padrão Singleton. Constructor
é privado e instance()
& $_instance
pertence ao padrão. Construtor tem spl_autoload_register
function.
spl_autoload_register( array( $this, 'load' ) );
que está chamando o método load
da classe própria.
As duas primeiras linhas deste método são:
$file = str_replace( '_', '-', strtolower( $class_name ) );
$file = 'class-' . $file;
que é bem direto. Se você seguir o WPCS , ele o encoraja a seguir uma convenção de nomenclatura de classe prefixada com a palavra class e, em seguida, o nome da classe. É claro que qualquer sublinhado (_) é substituído por (-) traço.
para que um nome de arquivo da classe WPSE_Post
seja class-wpse-post.php
Reduza os nomes das classes de maiúsculas e minúsculas com strtolower
e use str_replace
para substituir os sublinhados por traços. então WPSE_Post
agora se torna wpse-post
. finalmente adicionando um prefixo class-
na próxima linha.
Estou usando is_readable
na instrução condicional que pode ser trocada com file_exists
. supondo YOUR_PLUGIN_PATH
é o caminho base do plugin e classes-dir
está sob o diretório principal do plugin, contendo todas as suas classes que precisam de autoloading.
include_once
é usado para carregar o arquivo real na chamada.
Uso:
você só precisa incluir a classe de 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, em seguida, ligue para suas aulas sob demanda.
new XYX_Class();
Another_Class::instance(); // etc
Observação: não estou usando o método de namespace na minha solução para que ele possa ou não se encaixar de acordo com as suas necessidades, mas postado aqui na esperança de que alguém obtenha benefícios de carregar classes dinamicamente.