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