Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. WordPress Plugins
Code

Verwenden von Namespaces und Autoloading in WordPress-Plugins, Teil 4

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Using Namespaces and Autoloading in WordPress Plugins.
Using Namespaces and Autoloading in WordPress Plugins, Part 3

German (Deutsch) translation by Wei Zhang (you can also view the original English article)

Wenn dies das erste Tutorial ist, das Sie in dieser Serie lesen, dann empfehle ich sehr, das, was wir bisher besprochen haben, nachzuholen.

Im Wesentlichen kommst du am Ende der Show rein. An dieser Stelle haben wir den Grundstein für unser Plugin gelegt, das Plugin geschrieben und Namespaces und Autoloader definiert und erkundet. Alles was übrig bleibt, ist anzuwenden, was wir gelernt haben.

In diesem Tutorial werden wir alle Teile zusammenfügen. Insbesondere werden wir den Quellcode unseres Plugins erneut aufrufen, alle relevanten Klassen benennen und einen Autoloader schreiben, so dass wir alle unsere include-Anweisungen entfernen können.

Ich werde alles ausführlich besprechen, während wir den Code durcharbeiten. Auch wenn dies das erste Tutorial ist, das Sie in dieser Serie lesen, sollten Sie sich mit dem, was wir bisher besprochen haben, befassen und dann zu diesem Tutorial zurückkehren.

Bevor wir irgendeinen Code schreiben

Zu diesem Zeitpunkt sollten Sie wissen, wie wir unsere Entwicklungsumgebung eingerichtet haben. Zur Erinnerung, hier ist eine kurze Übersicht über die Software, die wir verwenden:

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

Sie werden auch eine Kopie des Quellcodes des Plugins benötigen, mit dem wir arbeiten. Sie können eine Kopie davon hier abholen. Angenommen, es ist installiert, aktiviert, und Sie haben Ihre IDE ausgeführt, fangen wir an.

Namespacing des Codes

Erinnern Sie sich 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 anschauen oder wenn Sie der bisherigen Serie folgen, sollten Sie folgendes sehen:

The directory structure of our plugin

Beachten Sie, dass, wenn Sie Ihr Plugin anders eingerichtet haben, das in Ordnung ist. Ihre Namespaces werden wahrscheinlich anders sein, aber das sollte nichts beeinflussen, was in dieser Serie behandelt wird.

Anhand der Verzeichnisstruktur als Richtlinie gehen wir alle PHP-Dateien durch, aus denen unser Plugin besteht, und definieren deren Namespaces. Dies ist ganz einfach: Sie müssen nur das Schlüsselwort namespace verwenden und oben in jeder Datei einen qualifizierten Namen eingeben.

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

Es gibt ein paar Dinge, die ich bezüglich der Konventionen beachten muss, die ich oben verwendet habe:

  • Der Stammnamespace ist Tutsplus_Namespace_Demo, der 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 verkapselt (im Gegensatz zu Kleinbuchstaben).

Schließlich, wenn Sie versucht haben, die Seite zu aktualisieren, oder Sie versucht haben, in WordPress zu navigieren, seit die Namespace-Anweisungen eingeführt wurden, dann sehen Sie wahrscheinlich einen Fehler in Ihrer Konsole, der ungefähr so aussieht:

PHP Errors when loading namespaced code

Und es enthält die folgende Nachricht:

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

Oder vielleicht zeigt es:

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

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

Aber es wirft die Frage auf: Was ist mit unserem Plugin los? Zum Glück nichts. Dies ist das erwartete Verhalten.

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

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

Hier kommt zusätzliche Namespace-Funktionalität und Autoloading ins Spiel. Bevor wir also versuchen, über ihren Namespace auf unseren Code zuzugreifen, arbeiten wir an einem Autoloader.

Alles über Autoloading

Das Schreiben eines Autoloaders erfordert Folgendes:

  1. Verständnis einer PHP-Funktion namens spl_autoload_register
  2. Schreiben einer Funktion, die automatisch unsere Namespaced-Dateien lädt
  3. einschließlich unserer benutzerdefinierten Autoloading-Funktion

Lassen Sie sich nicht vom Namen spl_autoload_register einschüchtern. Es bedeutet einfach, dass dies eine Funktion ist, die Teil der "Standard PHP Library" ist und es ist, wie wir eine "Autoload" -Funktion "registrieren". Es ist ein Mund voll zu sagen und viele Zeichen zu schreiben, aber es ist nur eine Funktion, die wir benutzen werden, um PHP mitzuteilen, wie man Namespaces und Klassennamen analysiert und wo es unsere Dateien finden kann.

Diese Funktion ermöglicht es uns, unseren eigenen benutzerdefinierten Code zum automatischen Laden von Dateien zu schreiben und dann diese Funktion in PHP einzubinden. Das heißt, wir teilen PHP mit, wo unsere Dateien zu finden sind und wie Namespaces, Dateinamen usw. analysiert werden, damit sie die Dateien enthalten.

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

Einen Autoloader schreiben

Wenn Sie einen Autoloader schreiben, sollten Sie nicht vergessen, wie unsere Dateien organisiert sind. Das heißt, wir möchten wissen, wie unsere Namespaces unseren Verzeichnissen zugeordnet werden.

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

Wenn PHP versucht, eine Klasse zu laden, muss unser Autoloader Folgendes tun:

  1. Teilen Sie den Namensraum basierend auf den Schrägstrichen auf.
  2. Teilen Sie das Paket und die Unterpakete basierend auf Unterstrichen auf und ersetzen Sie sie (falls erforderlich) durch Bindestriche.
  3. Erfahren Sie, wie Sie Klassennamen, Schnittstellen usw. Dateinamen zuordnen.
  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 Verzeichnis plugin ein Unterverzeichnis namens inc, und erstellen Sie im Verzeichnis inc eine Datei namens autoload.php.

Lassen Sie uns in dieser Datei weitermachen und die Funktion ausstellen, mit der wir unsere Dateien automatisch laden. Es sollte ungefähr so aussehen:

Offensichtlich tut dies noch nichts.

A Side Note zum Schreiben eines Autoloaders

Beachten Sie, dass ich den Code und die Kommentare schreiben werde, um zu erklären, was wir tun. Wenn Sie sich zum ersten Mal selbst darauf einlassen, ist es vielleicht frustrierend, einen Autoloader zusammen mit Namespaces zu schreiben und mit Dateien zu arbeiten. Hier können ein Debugger und die Verwendung von Protokolldateien nützlich sein.

Dies liegt außerhalb des Rahmens dieses Tutorials, aber Sie sollten wissen, dass das Schreiben eines Autoloaders nicht das Richtige für Sie ist, wenn Sie das erste Mal tun.

Komplettierung des Autoloaders

Beginnen wir mit dem Hinzufügen einiger Funktionen, indem 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 läuft, die an die Autoloading-Funktion übergeben werden. Wir machen das, weil es einfacher ist, einen Pfad zu der Datei zu erstellen, die automatisch geladen wird.

Danach müssen wir uns die $file_parts ansehen und alle Vorkommen des Unterstrichs durch einen Bindestrich ersetzen, da alle unsere Klassennamen und Schnittstellen Unterstriche verwenden, während unsere Dateinamen Bindestriche verwenden.

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

Als nächstes brauchen wir eine Bedingung, die ein paar Dinge tut.

  1. Es muss überprüft werden, welcher Eintrag des Pfads des Dateinamens, den wir gerade lesen.
  2. Wenn wir beim ersten Eintrag sind, dann haben wir den Dateinamen; Ansonsten sind wir in seinem Namensraum.
  3. Als nächstes, wenn wir den ersten Eintrag lesen, müssen wir feststellen, ob wir versuchen, eine Schnittstelle automatisch zu laden oder wir laden eine Klasse.
  4. Wenn es ersteres ist, dann müssen wir den Namen der Schnittstelle anpassen, damit wir sie basierend auf ihrem Dateinamen richtig laden; Andernfalls laden wir die Klasse basierend auf dem Wert in der Variablen $current.

Es liest sich wie eine Menge, aber es sollte nicht schrecklich kompliziert zu lesen sein. Sehen Sie den kommentierten Code unten:

Danach ist es an der Zeit, einen vollständig qualifizierten Pfad zur Datei zu erstellen. Glücklicherweise ist das wenig mehr als eine einfache Kettenverkettung:

Zuletzt müssen wir sicherstellen, dass die Datei existiert. Wenn nicht, zeigen wir eine Standard-WordPress-Fehlermeldung an:

Und an dieser Stelle haben wir einen vollständigen Autoloader (der durch Herunterladen der Dateien von dem Link in der Seitenleiste dieses Posts abgerufen werden kann, da der Quellcode hier im Tutorial ein wenig zu lang wäre).

Schließlich ist es wichtig zu beachten, dass diese spezielle Funktion als Klasse umgeschrieben werden kann (oder sollte). Außerdem sollte die Klasse aus mehreren kleineren Funktionen bestehen, von denen geprüft werden kann, die eine einzige Verantwortung tragen und die klarer gelesen werden als die obigen. Vielleicht werde ich in einem Bonus-Tutorial durch den Prozess gehen, wie das aussehen würde.

Aber wir schließen immer noch Dateien ein

Wenn Sie am oberen Rand der Haupt-Plugin-Datei (oder der Bootstrap-Datei, die wir oft aufgerufen haben) sehen, werden Sie mehrere Include-Anweisungen bemerken, die wie folgt aussehen:

Angesichts der Arbeit, die wir bis zu diesem Punkt geleistet haben, können wir diese Aussagen endlich entfernen und durch nur eine ersetzen:

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

Alles zusammenfügen

Jetzt, da wir unseren Code namespaced haben, um eine logische Organisation verwandter Klassen bereitzustellen, und einen Autoloader geschrieben haben, um automatisch Dateien basierend auf dem Namespace und dem Dateispeicherort jeder Klasse einzuschließen, sollten wir in der Lage sein, unser Plugin zu starten und es genau so laufen zu lassen während der ersten erfolgreichen Iteration.

Als letztes müssen wir sicherstellen, dass wir die Bootstrap-Datei aktualisieren, sodass wir PHP anweisen, die Namespaces für die Meta_Box, das Meta_Box_Display, den Question_Reader und den CSS_Loader zu verwenden.

Beachten Sie, dass wir im obigen Code das use-Schlüsselwort von PHP verwenden und unseren Klassennamen ihre unmittelbaren Unterpakete voranstellen. Sie können mehr über die Verwendung im Handbuch lesen, aber kurz gesagt:

Das use-Schlüsselwort muss im äußersten Bereich einer Datei (der globale Bereich) oder innerhalb von Namespace-Deklarationen deklariert sein. Dies liegt daran, dass das Importieren zur Kompilierzeit und nicht zur Laufzeit durchgeführt wird, daher kann es nicht im Blockbereich ausgeführt werden.

Wenn Sie davon ausgehen, dass alles ordnungsgemäß funktioniert, sollten Sie in der Lage sein, zur Seite "Neuen Beitrag hinzufügen" (oder "Beitrag bearbeiten") zu navigieren, unser Metabox anzuzeigen und am oberen Rand der Seitenleiste eine Frageaufforderung zu sehen:

The meta box prompting users for inspiration

Wenn ja, dann herzlichen Glückwunsch. Sie haben Ihr Plugin erfolgreich für Ihre Namespaces und das automatische Laden eingerichtet. Ist dies nicht der Fall, überprüfen Sie den Code anhand dessen, was wir hier geteilt haben, überprüfen Sie Ihre Fehlerprotokolle und stellen Sie sicher, dass nichts auf dem WordPress-Administrationsbildschirm auffällt.

Wenn Sie etwas sehen, ist die Wahrscheinlichkeit gering, dass es etwas zu tun hat. Überprüfen Sie den Code, den wir behandelt haben, vergleichen Sie ihn mit dem, was hier an diesem Post angehängt ist (in der Seitenleiste mit dem großen blauen Button), und prüfen Sie, ob Sie das Problem eingrenzen können.

Fazit

An diesem Punkt haben wir das Ende unserer Serie erreicht. In den letzten vier Tutorials haben wir sehr viel gelernt:

  • Wir haben ein Plugin entwickelt, das Benutzer mit Fragen dazu auffordert, ihr Bloggen zu starten.
  • 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 einen Blick darauf geworfen, wie sie angewendet werden können.
  • Wir haben unseren Code organisiert und unseren eigenen Autoloader geschrieben, der den Code lesbarer, organisierter und weniger überladen macht.

Letztendlich kann viel von dem Material, das in dieser Serie behandelt wird, in bestehenden und zukünftigen Projekten verwendet werden, an denen Sie 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ögere nicht, mir auf meinem Blog oder Twitter zu folgen, während ich fast täglich über Softwareentwicklung im Kontext von WordPress diskutiere.

Und denken Sie daran, der Link zum Herunterladen des finalen Quellcodes befindet sich in der Seitenleiste unter einem Button mit dem Titel Download Attachment. Natürlich zögern Sie nicht, Fragen in den Kommentaren zu stellen!

Ressourcen

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.