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