it-swarm.com.de

Soll ich spl_autoload_register () in meinem Plugin verwenden?

Wenn ich spl_autoload_register in meinem Plugin verwende, erhalte ich:

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

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

Ich habe ein bisschen gelesen und verschiedene Korrekturen gefunden. Einer von SO sagte, spl_autoload_register nicht mit WordPress zu verwenden.

Ist das genau

Ich bin sicher, dass ich eine "Lösung" für den Fehler finden kann, aber ich bin nicht sicher, ob ich das mit jeder WP Version tun möchte.

Wie soll ich meine Klassen laden, wenn ich die Autoload-Funktion nicht verwende? Hier ist, was jetzt bricht:

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

use MyPluginClasses\Student as MS;

$student = new MS\Student();

echo $student->sayHello();

Im Schüler:

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

        }

    }
}

Dieses Design funktioniert auch außerhalb von WordPress.

10
johnny

Ich bin mir wirklich nicht sicher, ob das automatische Laden von Klassen im WP-Plugin eine gute oder schlechte Praxis ist. Ich sehe keine Nebenwirkungen bei der Verwendung von spl_autoload_register (nicht getestete Leistung)

Um Ihre Frage zu beantworten, möchte ich eine Klasse aus meinem kommenden Plugin freigeben, mit der ich Klassen aus einem einzelnen Verzeichnis ohne Probleme automatisch laden kann, und das tut mir bisher gut.

/**
 * 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();

Um diese einfache Klasse in Teile zu unterteilen, wie Sie sehen, verwende ich das Singleton-Muster. Constructor ist privat und instance() & $_instance gehört zum Muster. Der Konstruktor hat die Funktion spl_autoload_register.

spl_autoload_register( array( $this, 'load' ) );

welches die load Methode von der Selbstklasse aufruft. Die ersten beiden Zeilen dieser Methode lauten:

$file = str_replace( '_', '-', strtolower( $class_name ) );
$file = 'class-' . $file;

das ist ziemlich gerade. Wenn SieWPCSfolgen, werden Sie aufgefordert, einer Klassennamenskonvention mit dem Präfix Word class und dann class name zu folgen. Natürlich wird ein Unterstrich (_) durch einen Bindestrich (-) ersetzt.

ein Dateiname der Klasse WPSE_Post wäre also class-wpse-post.php.

Namen von Klassen in Kleinbuchstaben mit strtolower und mit str_replace, um Unterstriche durch Bindestriche zu ersetzen. so wird WPSE_Post jetzt zu wpse-post. Fügen Sie schließlich in der nächsten Zeile ein Präfix class- hinzu.

ich verwende is_readable in bedingten Anweisungen, die durch file_exists ausgetauscht werden können. Angenommen, YOUR_PLUGIN_PATH ist der Basispfad des Plugins und classes-dir befindet sich unter dem Haupt-Plugin-Verzeichnis, in dem alle Klassen gespeichert sind, die automatisch geladen werden müssen.

include_once wird verwendet, um die aktuelle Datei auf Abruf zu laden.

Verwendungszweck:

sie müssen nur die obige Auto-Loader-Klasse in die Basisdatei Ihres Plugins aufnehmen

/**
 * Class autoloader.
 */
if ( ! class_exists( 'Annframe_Autoloader' ) ) {
    include_once YOUR_PLUGIN_PATH/class-annframe-autoloader.php';
}

und rufen Sie dann Ihre Klassen auf Anfrage an.

new XYX_Class();
Another_Class::instance(); // etc

Hinweis: Ich verwende keine Namespace-Methode in meiner Lösung, sodass sie möglicherweise Ihren Anforderungen entspricht oder nicht, aber in der Hoffnung, dass zumindest jemand die Vorteile des dynamischen Ladens von Klassen hat, hier veröffentlicht.

1
Anwer AR