Я действительно не уверен, хорошо ли это или плохо делать автоматическую загрузку классов в плагине 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()
без негативных побочных эффектов.