✅ WEB- und WordPress-Nachrichten, Themen, Plugins. Hier teilen wir Tipps und beste Website-Lösungen.

So implementieren Sie einen Autoloader mit Namespaces in Ihrem WordPress-Theme oder Plugin

13

Wenn Sie objektorientierten Code schreiben, ist ein Autoloader ein Muss. Ohne einen Autoloader müssten Sie eine Zeile mit der Klassendatei hinzufügen, bevor Sie sie initialisieren können. Es kann schnell umständlich werden, wenn man mit vielen Klassen arbeitet. Ein Autoloader ist eine Funktion, die jedes Mal ausgelöst wird, wenn eine neue Klasse instanziiert wird, und die Klassendatei enthält, bevor die Instanziierung erfolgt.

Namespaces sind eine Möglichkeit, Ihren Code zu strukturieren und zu kapseln, und helfen dabei, Namenskollisionen zu vermeiden. Wenn Sie OOP schreiben, wird empfohlen, auch Namespaces zu verwenden. Denken Sie daran, dass Sie einen Autoloader implementieren können, ohne Namespaces in Ihrem OOP-Code zu verwenden.

Sie können diesen Code für Ihr WordPress-Theme oder -Plug-in oder jeden anderen PHP-Code außerhalb von WordPress verwenden – ändern Sie einfach die Pfade entsprechend. Für dieses Beispiel erstelle ich einen Autoloader für ein WordPress-Theme.

Regeln für Klassennamensraum und -struktur

Die Implementierung eines Autoloaders erfordert einige definierte Regeln für Ihre Codestruktur und wo sie zu finden sind. Die Verwendung von Namespaces vereinfacht dies etwas, da Ihr Namespace auf den Ordner verweisen kann, in dem sich die Klassen befinden.

Treffen Sie zunächst eine Entscheidung, wie Ihr Namespace benannt werden soll. Normalerweise ist es etwas Einzigartiges für Ihren Code, zum Beispiel Ihr Designname. Der Namespace für das Thema dieser Website ist beispielsweise AWhitePixelTheme. Das bedeutet, dass sich alle Klassen in diesem Namespace befinden müssen, damit der Autoloader funktioniert.

namespace AWhitePixelTheme;

Meine erste Regel lautet, dass jede Klassendatei immer nur eine Klasse enthält und der Klassenname mit dem Dateinamen identisch sein muss. Zum Beispiel; Eine Klasse MyTestmuss in einer Datei definiert werden MyTest.php.

Meine zweite Regel ist, wie ich die Klassen in Ordnern strukturiere. Ich beschließe, dass alle Klassen in einem Ordner srcin meinem Thema abgelegt werden. Ich kann Klassendateien direkt in diesem Ordner ablegen, und dafür müssen sie sich im oben definierten „Root”-Namespace befinden. Wenn ich jedoch Unterordner erstellen und Klassendateien darin ablegen möchte, müssen ihre Namespaces die Ordnerstruktur enthalten. Zum Beispiel eine Klasse Datei MyTest.php, die sich im Ordner src/Test/befindet, muss dieser Namespace definiert sein:

namespace AWhitePixelThemeTest;

Erstellen des Autoloaders

Ich bewahre den Autoloader gerne in einer separaten Datei und außerhalb des src/Ordners auf, der nur für Klassendateien mit Namensräumen definiert ist. Als Beispiel erstelle ich eine Datei autoloader.phpim Ordner inc/in meinem Design.

PHP hat eine eingebaute Autoloader-Funktion: spl_autoload_register. Sie geben den Namen Ihrer Autoloader-Funktion als Parameter an und in dieser Funktion erhalten Sie die angeforderte Klasse als Argument (was Sie newbeim Instanziieren der Klasse hinterher geschrieben haben). Beim Instanziieren von Klassen mit Namensräumen, zB new AWhitePixelThemeTestMyTest(), wäre die bereitgestellte Variable für diese Funktion "AWhitePixelThemeTestMyTest".

Lassen Sie uns die Autoloader-Funktion hinzufügen und darin unseren erforderlichen Namespace für den Autoloader definieren:

Dann müssen wir diese Datei einbinden, damit unser Autoloader registriert wird. Da dies in einem Thema ist, füge ich das Include in die functions.php. Wenn Sie dies für ein Plugin verwenden, fügen Sie es in Ihre Plugin-Dateien ein. Die Autoloader-Datei muss frühzeitig hinzugefügt werden, bevor Klassen instanziiert werden. Ich setze dies in die allererste Zeile in meinem functions.php:

require_once(get_template_directory(). '/inc/autoloader.php');

Wenn Sie es für ein untergeordnetes Thema oder ein Plugin verwenden, ändern Sie den Pfad für Ihre Bedürfnisse.

Und das ist es. Jetzt ist der Autoloader vorhanden, aber er tut nichts. Kehren wir zur Autoloader-Funktion zurück und beenden Sie sie.

Schreiben und Testen der Autoloader-Funktion

Zuerst müssen wir sicherstellen, dass sich der angeforderte Klassenname tatsächlich in unserem Namensraum befindet. Wir prüfen einfach, ob der angegebene Namespace-Klassenname die Namespace-Zeichenfolge enthält, und wenn nicht, verlassen wir die Funktion. Danach entfernen wir den Namespace-Namen aus der Zeichenfolge, damit wir eventuelle Unterordner und Klassendateien ausarbeiten können.

Jetzt wandeln wir den bereitgestellten Namespace in einen tatsächlichen Pfad zur Datei um. Zunächst ersetzen wir einen eventuellen Backslash ""im Namensraum durch das Zeichen für Ordnertrennzeichen – dafür verwenden wir die PHP-Konstante DIRECTORY_SEPARATOR. Ganz am Ende fügen wir eine hinzu ".php". Und schließlich fügen wir vor dem String den vollständigen Root-Pfad hinzu. Da sich dies in einem Thema befindet, verwende ich get_template_directory(). Wenn Sie dies für ein Plugin verwenden, verwenden Sie eine Methode, die den vollständigen Pfad zu Ihrem Plugin zurückgibt.

... $class = str_replace($namespace, '', $class);   $class = str_replace('', DIRECTORY_SEPARATOR, $class). '.php'; $directory = get_template_directory(); $path = $directory. DIRECTORY_SEPARATOR. 'src'. DIRECTORY_SEPARATOR. $class; }

Jetzt müssen wir nur noch prüfen, ob die Datei existiert, und wenn ja, sie anfordern.

... $path = $directory. DIRECTORY_SEPARATOR. 'src'. DIRECTORY_SEPARATOR. $class;   if (file_exists($path)) { require_once($path); } }

Das ist es!

Lass es uns testen. Erstellen Sie einen Unterordner Testim Ordner Ihres src/Designs und legen Sie darin eine PHP-Datei mit dem Namen MyTest.php. Definieren Sie darin eine Klasse MyTestund befolgen Sie dabei die Regeln für Namensräume: AWhitePixelThemeTest. Ich füge einfach einen Ausdruck von „Erfolg” in die Konstruktionsfunktion ein, damit wir leicht sehen können, dass sie die Klasse tatsächlich initialisiert.

In unserer functions.php instanziieren wir einfach die Klasse, nachdem wir den Autoloader angefordert haben:

$test = new AWhitePixelThemeTestMyTest();

Aktualisieren Sie Ihre WordPress-Site und stellen Sie sicher, dass Sie die Meldung „Erfolg!” erhalten. ausgegeben.

Der Autoloader lädt automatisch alle Klassendateien, die sich in unserem definierten Namespace befinden, und folgt den richtigen Regeln. Sie können Klassen von überall innerhalb Ihres Designs instanziieren, sogar innerhalb der Klassen selbst.

Die volle Autoloader-Funktion

Als Referenz ist hier unsere letzte Autoloader-Funktion:

spl_autoload_register('awhitepixel_autoloader'); function awhitepixel_autoloader($class) { $namespace = 'AWhitePixelTheme';   if (strpos($class, $namespace) !== 0) { return; }   $class = str_replace($namespace, '', $class); $class = str_replace('', DIRECTORY_SEPARATOR, $class). '.php';   $directory = get_template_directory(); $path = $directory. DIRECTORY_SEPARATOR. 'src'. DIRECTORY_SEPARATOR. $class;   if (file_exists($path)) { require_once($path); } }

Aufnahmequelle: awhitepixel.com

Diese Website verwendet Cookies, um Ihre Erfahrung zu verbessern. Wir gehen davon aus, dass Sie damit einverstanden sind, Sie können sich jedoch abmelden, wenn Sie möchten. Annehmen Weiterlesen