मुझे वास्तव में यकीन नहीं है कि 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();
इस सरल वर्ग को भागों में तोड़ने के लिए जैसा कि आप देख रहे हैं कि मैं सिंगलटन पैटर्न का उपयोग कर रहा हूं। Constructor
निजी है और instance()
और $_instance
पैटर्न के अंतर्गत आता है। कंस्ट्रक्टर का spl_autoload_register
फंक्शन है।
spl_autoload_register( array( $this, 'load' ) );
जो load
स्वयं वर्ग से कॉलिंग विधि है। इस विधि से पहली दो पंक्तियाँ हैं:
$file = str_replace( '_', '-', strtolower( $class_name ) );
$file = 'class-' . $file;
जो बहुत सीधा है। यदि आप WPCS का पालन करते हैं, तो यह आपको शब्द वर्ग और फिर वर्ग नाम के साथ उपसर्ग करने वाले वर्ग नामकरण सम्मेलन का अनुसरण करने के लिए प्रोत्साहित करता है । किसी भी अंडरस्कोर (_) को बदलकर (-) डैश से बदल दिया जाता है।
इसलिए कक्षा का एक फ़ाइल नाम 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()
नकारात्मक दुष्प्रभावों के बिना उपयोग कर सकते हैं ।