Verwenden von Namespaces und automatisches Laden in WordPress-Plugins, Teil 4

Wenn dies das erste Tutorial ist, das Sie in dieser Serie lesen, dann empfehle ich Ihnen dringend, das, was wir bisher beschrieben haben, zu erfahren.

Im Wesentlichen kommen Sie am Ende der Show herein. An diesem Punkt haben wir die Grundlage für unser Plugin gelegt, das Plugin geschrieben und Namespaces und Autoloader definiert und untersucht. Alles, was übrig bleibt, ist, das Erlernte anzuwenden.

In diesem Tutorial werden wir also alle Teile zusammenfügen. Insbesondere werden wir den Quellcode unseres Plugins überarbeiten, den Namensraum aller relevanten Klassen erstellen und einen Autoloader schreiben, damit wir alle unsere Include-Anweisungen entfernen können.

Ich werde alles ausführlich besprechen, während wir den Code durcharbeiten. Wenn dies das erste Tutorial ist, das Sie in dieser Serie lesen, informieren Sie sich darüber, was wir bisher behandelt haben, und kehren Sie dann zu diesem Tutorial zurück.

Bevor wir einen Code schreiben

Zu diesem Zeitpunkt sollten Sie mit der Einrichtung unserer Entwicklungsumgebung vertraut sein. Zur Wiederholung hier ein kurzer Überblick über die Software, die wir verwenden:

  • mindestens PHP 5.6.20
  • der Apache-Webserver
  • ein MySQL-Datenbankserver
  • WordPress 4.6.1
  • Grundkenntnisse der WordPress Plugin API

Sie benötigen auch eine Kopie des Quellcodes des Plugins, mit dem wir arbeiten. Sie können sich hier eine Kopie davon holen. Vorausgesetzt, es ist installiert, aktiviert und Ihre IDE läuft, beginnen wir.

Namensraum für den Code

Ich erinnere mich an das vorherige Tutorial. Ich bin ein Fan davon, sicherzustellen, dass unsere Namespaces der Organisation der Dateien auf der Festplatte folgen. Wenn Sie sich die Verzeichnisstruktur unseres Plugins ansehen oder die Serie bisher mitverfolgt haben, sollten Sie etwa Folgendes sehen:

Wenn Sie Ihr Plugin anders eingerichtet haben, ist das in Ordnung. Ihre Namespaces werden sich wahrscheinlich unterscheiden, aber dies sollte sich nicht auf alles auswirken, was in dieser Serie behandelt wird.

Gehen wir die Verzeichnisstruktur als Richtlinie durch, gehen wir alle PHP-Dateien durch, aus denen unser Plugin besteht, und definieren deren Namespaces. Dies ist ganz einfach: Es geht einfach darum, das Namespace-Schlüsselwort zu verwenden und oben in jeder Datei einen qualifizierten Namen zu platzieren.

Ich werde jeden unten auflisten.

tutsplus-namespace-demo.php

class-meta-box.php

class-meta-box-display.php

interface-assets.php

class-css-loader.php

class-question-reader.php

Zu den oben genannten Konventionen sind einige Dinge zu beachten:

  • Der Root-Namespace lautet Tutsplus_Namespace_Demo, was dem Verzeichnisnamen des Plugins entspricht.
  • Der Rest der Namespaces wie Tutsplus_Namespace_Demo \ Admin und Tutsplus_Namespace_Demo \ Admin \ Util entsprechen auch ihren jeweiligen Verzeichnissen; Die Verzeichnisnamen sind jedoch mit Großbuchstaben versehen (im Gegensatz zu Kleinbuchstaben)..

Wenn Sie seit der Einführung der Namespace-Anweisungen versucht haben, die Seite zu aktualisieren oder in WordPress zu navigieren, wird in der Konsole wahrscheinlich ein Fehler angezeigt, der ungefähr wie folgt aussieht:

Und es enthält die folgende Nachricht:

PHP Warnung: call_user_func_array () erwartet, dass Parameter 1 ein gültiger Rückruf ist. Die Funktion 'tutsplus_namespace_demo' wurde nicht gefunden oder ein ungültiger Funktionsname in /Users/tommcfarlin/Dropbox/Projekte/tutsplus/wp-includes/plugin.php in Zeile 524

Oder vielleicht zeigt es:

Schwerwiegender PHP-Fehler: Die Klasse 'Meta_Box' wurde in /Users/tommcfarlin/Dropbox/Projects/tutsplus/wp-content/plugins/tutsplus-namespace-demo/tutsplus-namespace-demo.php in Zeile 48 nicht gefunden

Oder Sie können eine beliebige Anzahl anderer ähnlicher Fehlermeldungen anzeigen. Das ist okay. Es ist normal.

Es stellt sich jedoch die Frage: Was ist mit unserem Plugin los? Zum Glück nichts. Dies ist erwartetes Verhalten.

Die erste Nachricht, die Sie sehen kann ein Ergebnis eines anderen Plugins sein, das Sie installiert haben. Ich konnte es nicht alleine reproduzieren; Wenn ich jedoch einige der anderen Plugins deaktiviere, die ich ausgeführt habe, hat das Plugin die zweite Nachricht generiert (dies ist die Nachricht, die ich demonstrieren wollte)..

Wenn Sie einen Namespace-Code angeben, erwartet PHP eine Klasse innerhalb eines bestimmten Namespaces. Konzeptionell können Sie sich vorstellen, dass Ihre Klassen jetzt zu ihrem eigenen Paket (oder Unterpaket) gehören oder wie Sie es definieren. Damit eine Funktion auf eine Klasse innerhalb eines Pakets zugreifen kann, muss sie auf die vorhandenen Pakete aufmerksam gemacht werden.

Hier kommen zusätzliche Namespace-Funktionen und automatisches Laden zum Einsatz. Bevor wir also versuchen, über ihre Namespaces auf unseren Code zuzugreifen, müssen wir einen Autoloader verwenden.

Alles über das automatische Laden

Das Schreiben eines Autoloaders erfordert Folgendes:

  1. Verstehen einer aufgerufenen PHP-Funktion spl_autoload_register
  2. Schreiben einer Funktion, die automatisch unsere Namensraumdateien lädt
  3. einschließlich unserer benutzerdefinierten Autoloading-Funktion

Lass den Namen nicht spl_autoload_register dich einschüchtern Es bedeutet einfach, dass dies eine Funktion ist, die Teil der "Standard PHP Library" ist und wie wir eine "Autoload" -Funktion "registrieren". Es ist ein Schluck und viele Charaktere, die geschrieben werden müssen, aber es ist nur eine Funktion, mit der wir PHP mitteilen, wie sie Namespaces und Klassennamen parsen und wo sie unsere Dateien finden können.

Diese Funktion ermöglicht es uns, unseren eigenen benutzerdefinierten Code für das automatische Laden von Dateien zu erstellen und diese Funktion dann in PHP einzuhängen. Das heißt, wir werden PHP mitteilen, wo wir unsere Dateien finden und wie Namespaces, Dateinamen usw. analysiert werden, damit sie die Dateien enthalten.

Nach all dem sind wir bereit, einen Autoloader zu schreiben.

Autoloader schreiben

Beim Schreiben eines Autoloaders ist zu beachten, wie unsere Dateien organisiert sind. Das heißt, wir möchten wissen, wie wir unsere Namespaces unseren Verzeichnissen zuordnen. 

In dem Beispiel, das wir verwenden, ist es einfach: Die Namespaces sind Versionen der Verzeichnisstruktur. Dies gilt nicht immer für andere Projekte. Dies ist jedoch ein weiterer Grund, warum ich meine Dateien nach ihrem physischen Standort logisch organisieren möchte.

Wenn PHP versucht, eine Klasse zu laden, muss unser Autoloader folgende Schritte ausführen:

  1. Teilen Sie den Namespace basierend auf den Schrägstrichen auf.
  2. Teilen Sie das Paket und die Unterpakete basierend auf Unterstrichen auf und ersetzen Sie sie durch Bindestriche (falls erforderlich)..
  3. Wissen, wie Klassennamen, Schnittstellen usw. Dateinamen zugeordnet werden.
  4. Erstellen Sie eine Zeichenfolgendarstellung des Dateinamens basierend auf den obigen Informationen.
  5. Fügen Sie die Datei ein.

Mit all diesen Punkten haben wir unsere Arbeit für uns erledigt. Erstellen Sie im Plugin-Verzeichnis ein Unterverzeichnis mit dem Namen inc, und in der inc Verzeichnis erstellen Sie eine Datei namens autoload.php.

Lassen Sie uns innerhalb dieser Datei die Funktion herausfiltern, die wir zum automatischen Laden unserer Dateien verwenden werden. Es sollte ungefähr so ​​aussehen:

Offensichtlich tut das noch nichts.

Eine Randnotiz zum Schreiben eines Autoloaders

Beachten Sie, dass ich den Code und die Codekommentare schreibe, um gründlich zu erklären, was wir tun. Wenn Sie sich zum ersten Mal alleine damit beschäftigen, kann es etwas frustrierend sein, einen Autoloader zusammen mit Namespaces zu schreiben und mit Dateien zu arbeiten. Hier können ein Debugger und die Verwendung von Protokolldateien hilfreich sein. 

Dies liegt außerhalb des Anwendungsbereichs dieses Tutorials, aber Sie sollten wissen, dass das Schreiben eines Autoloaders nicht das Richtige für Sie ist, wenn Sie es zum ersten Mal ausführen.

Autoloader abschließen

Beginnen wir mit dem Hinzufügen einiger Funktionen, wenn Sie die am Anfang dieses Abschnitts aufgeführten Schritte ausführen.

Zuerst müssen wir eine Schleife einrichten, die rückwärts durch die Teile des Dateinamens geht, die an die Autoloading-Funktion übergeben werden. Wir machen dies, weil es einfacher ist, einen Pfad zu der Datei zum automatischen Laden zu erstellen.

 0; $ i--) // Mehr dazu… 

Danach müssen wir uns das anschauen $ file_parts und ersetzen Sie alle Vorkommen des Unterstrichs durch einen Bindestrich, da alle unsere Klassennamen und unser Interface Unterstriche verwenden, während unsere Dateinamen Bindestriche verwenden.

Die folgenden zwei Zeilen sind die ersten zwei Zeilen innerhalb der Schleife, die wir oben abgesetzt haben:

Als Nächstes brauchen wir eine Bedingung, die einige Dinge bewirkt.

  1. Es muss geprüft werden, welchen Eintrag des Pfads des Dateinamens, den wir lesen.
  2. Wenn wir beim ersten Eintrag sind, dann sind wir beim Dateinamen; Andernfalls befinden wir uns in seinem Namensraum.
  3. Wenn wir den ersten Eintrag lesen, müssen wir als Nächstes feststellen, ob wir versuchen, eine Schnittstelle automatisch zu laden oder eine Klasse zu laden.
  4. Wenn es sich um das erste handelt, müssen wir den Namen der Schnittstelle anpassen, damit wir sie basierend auf ihrem Dateinamen ordnungsgemäß laden. Andernfalls laden wir die Klasse basierend auf dem Wert in der $ current Variable.

Es liest sich wie viel, aber das Lesen sollte nicht unheimlich kompliziert sein. Siehe den kommentierten Code unten:

Wenn dies erledigt ist, ist es Zeit, einen vollständig qualifizierten Pfad zur Datei zu erstellen. Zum Glück ist dies nicht mehr als eine grundlegende Verkettung von Strings:

Schließlich müssen wir sicherstellen, dass die Datei existiert. Wenn nicht, wird eine Standard-WordPress-Fehlermeldung angezeigt:

Und an diesem Punkt haben wir einen vollständigen Autoloader (der abgerufen werden kann, indem die Dateien über den Link in der Seitenleiste dieses Beitrags heruntergeladen werden, da der Quellcode hier im Tutorial etwas zu veröffentlichen wäre)..

Schließlich ist es wichtig anzumerken, dass diese bestimmte Funktion als Klasse überschrieben werden kann (oder sollte). Darüber hinaus sollte die Klasse aus mehreren kleineren Funktionen bestehen, von denen überprüfbar sind, eine einzige Verantwortung haben und klarer lesen als das, was darüber liegt. Vielleicht gehe ich in einem Bonus-Tutorial durch den Prozess, wie das aussehen würde.

Aber wir enthalten immer noch Dateien

Wenn Sie in der Nähe der Haupt-Plugin-Datei (oder der Bootstrap-Datei, die wir oft genannt haben) sehen, werden Sie mehrere davon finden umfassen Aussagen, die so aussehen:

In Anbetracht der bisher geleisteten Arbeit können wir diese Aussagen endgültig entfernen und durch nur eine ersetzen:

Um es klar zu sagen, ersetzen wir es durch unseren Autoloader. An diesem Punkt sollten wir mit unserem Plugin fertig sein.

Alles zusammenfügen

Nun, da wir unseren Code mit einem Namensraum versehen haben, um eine logische Organisation zusammengehöriger Klassen bereitzustellen, und einen Autoloader geschrieben haben, der automatisch Dateien enthält, die auf dem Namensraum und dem Speicherort der einzelnen Klassen basieren, sollten wir unser Plugin starten und es genau so ausführen können während der ersten erfolgreichen Iteration.

Das letzte, was wir tun müssen, ist sicherzustellen, dass wir die Bootstrap-Datei aktualisieren, um PHP anzuweisen, die Namespaces für die Datei zu verwenden Meta_Box, Meta_Box_Display, das Question_Reader, und das CSS_Loader.

drin(); $ meta_box-> init (); 

Beachten Sie im obigen Code, dass wir PHP verwenden benutzen Schlüsselwort, und wir setzen unseren Klassennamen ihre unmittelbaren Unterpakete voran. Sie können mehr über die Verwendung in der Anleitung lesen, aber der Mangel daran ist:

Das benutzen Schlüsselwort muss im äußersten Bereich einer Datei (im globalen Bereich) oder innerhalb von Namespace-Deklarationen deklariert werden. Dies liegt daran, dass das Importieren zur Kompilierungszeit und nicht zur Laufzeit erfolgt, sodass der Blockbereich nicht festgelegt werden kann. 

Wenn dies gesagt ist und alle Funktionen korrekt sind, sollten Sie in der Lage sein, zu der zu navigieren Neuen Beitrag hinzufügen Seite (oder Beitrag bearbeiten), sehen Sie sich unsere Meta-Box an und sehen Sie oben auf der Seitenleiste eine Eingabeaufforderung:

Wenn ja, dann herzlichen Glückwunsch. Sie haben Ihr Plugin erfolgreich in Ihren Namespaces eingerichtet und automatisch geladen. Wenn nicht, überprüfen Sie den Code mit dem, was wir hier geteilt haben, überprüfen Sie Ihre Fehlerprotokolle und vergewissern Sie sich, dass im WordPress-Verwaltungsbildschirm nichts ungewöhnlich angezeigt wird.

Wenn du tun etwas sehen, Wahrscheinlichkeiten haben etwas mit Kleinigkeiten zu tun. Überprüfen Sie den Code, den wir behandelt haben, und vergleichen Sie ihn mit dem, was an diesem Beitrag angehängt ist (in der Seitenleiste zusammen mit dem großen blauen Knopf), und prüfen Sie, ob Sie das Problem eingrenzen können.

Fazit

Zu diesem Zeitpunkt sind wir am Ende unserer Serie angelangt. In den letzten vier Tutorials haben wir eine Menge Grundlegendes besprochen:

  • Wir haben ein Plugin entwickelt, das Benutzer mit Fragen auffordert, um das Bloggen zu beschleunigen.
  • Wir haben PHP-Funktionen zum Lesen von Dateien aus dem Dateisystem und zum Rendern in der Anzeige verwendet.
  • Wir haben Namespaces und Autoloading definiert und uns angesehen, wie sie angewendet werden können.
  • Wir haben unseren Code organisiert und unseren eigenen Autoloader geschrieben, um den Code lesbarer, organisierter und weniger übersichtlich zu machen.

Letztendlich kann ein Großteil des Materials, das in dieser Serie behandelt wird, in bestehenden und zukünftigen Projekten verwendet werden, an denen Sie möglicherweise arbeiten. 

Denken Sie daran, dass Sie auch andere WordPress-Produkte in unserem Marktplatz finden können. Und wenn Sie mehr über die Entwicklung von Lösungen für WordPress erfahren möchten, finden Sie alle meine Tutorials und Serien auf meiner Profilseite. Zögern Sie nicht, mir auf meinem Blog oder auf Twitter zu folgen, da ich fast täglich über Softwareentwicklung im Kontext von WordPress diskutiere.

Und denken Sie daran, der Link zum Herunterladen des endgültigen Quellcodes befindet sich in der Seitenleiste unter einer Schaltfläche mit dem Titel Anhang herunterladen. Zögern Sie nicht, Fragen in den Kommentaren zu stellen!

Ressourcen

  • spl_autoload_register
  • benutzen