Naprawdę nie jestem pewien, czy dobrą lub złą praktyką jest automatyczne ładowanie klas we wtyczce WP. Dla mnie nie widzę żadnych skutków ubocznych używania spl_autoload_register
(nie testowana wydajność)
Aby odpowiedzieć na twoje pytanie, chciałbym podzielić się klasą z mojej nadchodzącej wtyczki, której używam do automatycznego ładowania klas z jednego katalogu bez żadnych problemów i jak dla mnie to dobrze.
/**
* 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();
Aby rozbić tę prostą klasę na części, jak widać, używam wzorca Singleton. Constructor
są prywatne instance()
i $_instance
należący do wzorca. Konstruktor ma spl_autoload_register
funkcję.
spl_autoload_register( array( $this, 'load' ) );
która wywołuje load
metodę z klasy własnej. Pierwsze dwie linie tej metody to:
$file = str_replace( '_', '-', strtolower( $class_name ) );
$file = 'class-' . $file;
co jest całkiem proste. jeśli postępujesz zgodnie z WPCS , zachęca cię do przestrzegania konwencji nazewnictwa klas poprzedzonej słowem class, a następnie nazwa klasy. oczywiście wszelkie podkreślenia (_) są zastępowane myślnikiem (-).
więc nazwa pliku klasy WPSE_Post
toclass-wpse-post.php
Niższe nazwy klas obudów za strtolower
pomocą i za pomocą str_replace
zastępuj podkreślniki myślnikami. tak WPSE_Post
teraz staje się wpse-post
. w końcu dodając prefiks class-
w następnym wierszu.
używam is_readable
w warunkowym oświadczeniu, które można wymienić file_exists
. zakładając, że YOUR_PLUGIN_PATH
jest to podstawowa ścieżka wtyczki i classes-dir
znajduje się pod głównym katalogiem wtyczek, w którym przechowywane są wszystkie klasy, które wymagają automatycznego ładowania.
include_once
służy do ładowania rzeczywistego pliku podczas połączenia.
Stosowanie:
wystarczy dołączyć powyższą klasę modułu ładującego do pliku podstawowego wtyczki
/**
* Class autoloader.
*/
if ( ! class_exists( 'Annframe_Autoloader' ) ) {
include_once YOUR_PLUGIN_PATH/class-annframe-autoloader.php';
}
a następnie zadzwoń na zajęcia na żądanie.
new XYX_Class();
Another_Class::instance(); // etc
Uwaga: w moim rozwiązaniu nie używam metody przestrzeni nazw, więc może ona, ale nie musi, pasować do twoich potrzeb, ale opublikowałem ją tutaj, mając nadzieję, że przynajmniej ktoś uzyska korzyści z dynamicznego ładowania klas.
spl_autoload_register()
bez negatywnych skutków ubocznych.