Je ne sais vraiment pas si c'est une bonne ou une mauvaise pratique de charger automatiquement des classes dans le plugin WP. Pour moi, je ne vois aucun effet secondaire de l'utilisation spl_autoload_register
(performances non testées)
Donc, pour répondre à votre question, je voudrais partager une classe de mon prochain plugin que j'utilise pour charger automatiquement les classes à partir d'un seul répertoire sans aucun problème et cela me convient jusqu'à présent.
/**
* 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();
Pour briser cette classe simple en plusieurs parties comme vous le voyez, j'utilise le modèle Singleton. Constructor
est privé et instance()
et $_instance
appartient au modèle. Le constructeur a une spl_autoload_register
fonction.
spl_autoload_register( array( $this, 'load' ) );
qui appelle la load
méthode de l'auto-classe. Les deux premières lignes de cette méthode sont:
$file = str_replace( '_', '-', strtolower( $class_name ) );
$file = 'class-' . $file;
ce qui est assez simple. si vous suivez WPCS, il vous encourage à suivre une convention de dénomination de classe précédée du mot classe et du nom de classe. bien entendu, tout trait de soulignement (_) est remplacé par un tiret (-).
donc un nom de fichier de classe WPSE_Post
seraitclass-wpse-post.php
Diminuez les noms de classe de casse avec strtolower
et en utilisant str_replace
pour remplacer les tirets bas par des tirets. donc WPSE_Post
devient maintenant wpse-post
. enfin ajouter un préfixe class-
sur la ligne suivante.
j'utilise is_readable
dans une déclaration conditionnelle qui est échangeable avec file_exists
. en supposant que YOUR_PLUGIN_PATH
le chemin de base du plugin classes-dir
est sous le répertoire principal du plugin contenant toutes vos classes qui nécessitent un chargement automatique.
include_once
est utilisé pour charger le fichier réel sur appel.
Usage:
il vous suffit d'inclure la classe de chargeur automatique ci-dessus dans le fichier de base de votre plugin
/**
* Class autoloader.
*/
if ( ! class_exists( 'Annframe_Autoloader' ) ) {
include_once YOUR_PLUGIN_PATH/class-annframe-autoloader.php';
}
puis appelez vos cours sur demande.
new XYX_Class();
Another_Class::instance(); // etc
Remarque: Je n'utilise pas la méthode namespace dans ma solution, elle peut donc ou non correspondre à vos besoins, mais publiée ici dans l'espoir que quelqu'un profite au moins des avantages du chargement dynamique des classes.
spl_autoload_register()
sans effets secondaires négatifs.