Klassen-Autoloader im WordPress-Plugin

Lesezeit: 2 Minuten

Ich möchte einen Klassen-Autoloader schreiben, der in einem WordPress-Plugin verwendet werden kann. Dieses Plugin wird auf mehreren Seiten installiert, und ich möchte die Wahrscheinlichkeit von Konflikten mit anderen Plugins minimieren.

Der Autoloader sieht in etwa so aus:

function __autoload($name) {
    //some code here
}

Mein Hauptproblem ist, was passiert, wenn eine andere Klasse auch eine solche Funktion verwendet? Ich denke, es wird zwangsläufig Probleme geben. Was wäre der beste Weg, um so etwas zu vermeiden?

Ich versuche, keine Namespaces zu verwenden, damit der Code auch auf früheren Versionen von PHP funktioniert.

Klassen Autoloader im WordPress Plugin
Hugo R

Verwenden Sie eine Implementierung wie diese.

function TR_Autoloader($className)
{
    $assetList = array(
        get_stylesheet_directory() . '/vendor/log4php/Logger.php',
        // added to fix woocommerce wp_email class not found issue
        WP_PLUGIN_DIR . '/woocommerce/includes/libraries/class-emogrifier.php'
        // add more paths if needed.
    );

// normalized classes first.
    $path = get_stylesheet_directory() . '/classes/class-';
    $fullPath = $path . $className . '.php';

    if (file_exists($fullPath)) {
        include_once $fullPath;
    }

    if (class_exists($className)) {
        return;
    } else {  // read the rest of the asset locations.
        foreach ($assetList as $currentAsset) {
            if (is_dir($currentAsset)) {
               foreach (new DirectoryIterator($currentAsset) as $currentFile) 
{
                    if (!($currentFile->isDot() || ($currentFile->getExtension() <> "php")))
                        require_once $currentAsset . $currentFile->getFilename();
                }
            } elseif (is_file($currentAsset)) {
                require_once $currentAsset;
            }

        }
    }
}

spl_autoload_register('TR_Autoloader');

Grundsätzlich ist dieser Autoloader registriert und hat folgende Features:

  • Sie können eine bestimmte Klassendatei hinzufügen, wenn Sie nicht einem bestimmten Muster für den Speicherort der Dateien folgen, die Ihre Klassen enthalten (assetList).
  • Sie können Ihrer Suche nach Ihren Klassen ganze Verzeichnisse hinzufügen.
  • Wenn die Klasse bereits definiert ist, können Sie weitere Logik hinzufügen, um damit umzugehen.
  • Sie können die bedingte Klassendefinition in Ihrem Code verwenden und dann Ihre Klassendefinition im Klassenladeprogramm überschreiben.

Wenn Sie dies nun auf OOP-Weise tun möchten, fügen Sie einfach die Autoloader-Funktion in eine Klasse ein. (dh: myAutoloaderClass) und rufen Sie es vom Konstruktor auf. dann fügen Sie einfach eine Zeile in Ihre functions.php ein

new myAutoloaderClass(); 

und den Konstruktor hinzufügen

function __construct{
   spl_autoload_register('TR_Autoloader' , array($this,'TR_Autoloader'));
}

Hoffe das hilft. HR

Ich empfehle die Verwendung von Namespaces und PSR-4. Du könntest einfach kopieren dieses Autoloader-Beispiel aus FIG.

Aber wenn Sie das nicht möchten, können Sie einen Autoloader verwenden wie dieserdie eine Konvention für WP-Klassennamen definiert und diese verwendet, um die Klassendatei zu finden.

Wenn Sie also beispielsweise eine Klasse „Main“ aufrufen, versucht dieser Autoloader, die Klassendatei aus dem Pfad einzuschließen:

<plugin-path>/class-main.php

1004600cookie-checkKlassen-Autoloader im WordPress-Plugin

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy