Я действительно не уверен, хорошо ли это или плохо делать автоматическую загрузку классов в плагине WP. Для меня я не вижу никаких побочных эффектов использования spl_autoload_register(не проверенная производительность)
Поэтому, чтобы ответить на ваш вопрос, я хотел бы поделиться с классом из моего предстоящего плагина, который я использую для автоматической загрузки классов из одного каталога без каких-либо проблем, и это пока хорошо для меня.
/**
* 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();
Чтобы разбить этот простой класс на части, как вы видите, я использую шаблон Singleton. Constructorявляется приватным и instance()& $_instanceотносится к образцу. Конструктор имеет spl_autoload_registerфункцию.
spl_autoload_register( array( $this, 'load' ) );
который вызывает loadметод из собственного класса. Первые две строки этого метода:
$file = str_replace( '_', '-', strtolower( $class_name ) );
$file = 'class-' . $file;
что довольно прямо. если вы следуете WPCS, это побуждает вас следовать соглашению об именах классов с префиксом word class и затем class name. Конечно, любое подчеркивание (_) заменяется на (-) тире.
поэтому имя файла класса WPSE_Postбудетclass-wpse-post.php
Имена классов в нижнем регистре с strtolowerи используют str_replaceдля замены подчеркивания тире. так WPSE_Postтеперь и становится wpse-post. наконец добавив префикс class-на следующей строке.
Я использую is_readableв условном заявлении, которое можно обменять с file_exists. предполагая, YOUR_PLUGIN_PATHчто это базовый путь плагина и classes-dirнаходится в директории основного плагина, содержащей все ваши классы, которые требуют автозагрузки.
include_once используется для загрузки актуального файла по вызову.
Использование:
вам просто нужно включить вышеупомянутый класс автозагрузчика в базовый файл вашего плагина
/**
* Class autoloader.
*/
if ( ! class_exists( 'Annframe_Autoloader' ) ) {
include_once YOUR_PLUGIN_PATH/class-annframe-autoloader.php';
}
а затем позвоните в ваши классы по требованию.
new XYX_Class();
Another_Class::instance(); // etc
Примечание. Я не использую метод пространства имен в своем решении, поэтому он может подходить или не соответствовать вашим потребностям, но размещен здесь в надежде, что кто-то хотя бы получит преимущества от загрузки классов динамически.
spl_autoload_register()без негативных побочных эффектов.