क्या मुझे अपने प्लगइन में spl_autoload_register () का उपयोग करना चाहिए?


11

जब मैं अपने प्लगइन में spl_autoload_register का उपयोग करता हूं, मुझे मिलता है:

    Fatal error: Uncaught exception 'LogicException' with message
   'Class wp_atom_server could not be loaded'

    wp-includes\pluggable-deprecated.php on line 182

मैंने कुछ पठन किया और विभिन्न सुधार पाए। SO पर एक ने कहा कि WordPress के साथ spl_autoload_register का उपयोग न करें।

क्या यह सही है?

मुझे यकीन है कि मुझे त्रुटि के लिए "फिक्स" मिल सकता है, लेकिन मुझे यकीन नहीं है कि मैं प्रत्येक WP रिलीज के साथ ऐसा करना चाहता हूं।

यदि मैं ऑटोलैड फ़ंक्शन का उपयोग नहीं करता हूं, तो मुझे अपनी कक्षाएं कैसे लोड करनी चाहिए? यहाँ अब क्या टूटता है:

spl_autoload_extensions(".php");
spl_autoload_register();

use MyPluginClasses\Student as MS;

$student = new MS\Student();

echo $student->sayHello();

छात्र में:

<?PHP
namespace MyPluginClasses\Student
{
    class Student{
        public function __Construct(){
            echo "Hello Johnny";
        }
        public function sayHello(){
            echo "Hello Johnny's Method";

        }

    }
}

यह डिज़ाइन वर्डप्रेस के बाहर ठीक काम करता है।


4
मैंने अपना उत्तर अपडेट कर दिया है । यदि आप इसे सही करते हैं - कॉलबैक फ़ंक्शन के साथ - आप spl_autoload_register()नकारात्मक दुष्प्रभावों के बिना उपयोग कर सकते हैं ।
FUXIA

1
@toscho क्या आपका कोड अभी भी WP में ऑटोलॉडिंग करने का सबसे अच्छा तरीका है?
जॉनी

नहीं ऐसा नहीं है। सबसे तेज़ तरीका glob()एक बार निर्देशिका में है, तब कक्षाओं को वितरित करें जब उन्हें प्रति आवश्यकता हो spl_autoload_register()
FUXIA

1
मैं बहुभाषी प्रेस से हमारे वर्तमान (अभी तक प्रकाशित नहीं) समाधान दिखाते हुए बाद में एक उत्तर लिखूंगा।
FUXIA

जवाबों:


1

मुझे वास्तव में यकीन नहीं है कि 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

नोट: मैं अपने समाधान में नेमस्पेस विधि का उपयोग नहीं कर रहा हूं, इसलिए यह आपकी आवश्यकताओं के अनुसार फिट हो सकता है या नहीं, लेकिन यहां इस उम्मीद में पोस्ट किया गया है कि किसी को कम से कम गतिशील रूप से लोडिंग कक्षाओं का लाभ मिले।


-1
    function MyPluginClasses_autoloader( $class_name ) {
  if ( false !== strpos( $class_name, 'MyPluginClasses' ) ) {
    $parts = explode('\\', $class_name);
    require_once RoothPath . DIRECTORY_SEPARATOR .'lib'.DIRECTORY_SEPARATOR.end($parts) . '.php';
  }
}
spl_autoload_register( 'MyPluginClasses_autoloader' );
use MyPluginClasses\Student as MS;
$student = new MS\Student();
echo $student->sayHello();

2
यद्यपि पोस्टिंग कोड अच्छा है, आपको यह बताना चाहिए कि यह प्रश्न का उत्तर कैसे और क्यों देता है।
लक्ष्मण

1
जैसा कि आपका प्लगइन सिस्टम में एकमात्र प्लगइन नहीं है, कोड जो केवल कक्षाओं को सत्यापित किए बिना पहले लोड करता है कि वे आपके हैं, जल्द ही या बाद में किसी अन्य प्लगइन में घोषित वर्ग के लिए गलत फ़ाइल को लोड करने का प्रयास करके मुसीबत पैदा करने वाला है।
मार्क कप्लून
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.