Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. WordPress Plugins
Code

Objektorientiertes Autoloading in WordPress, Teil 1

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Object-Oriented Autoloading in WordPress.
Object-Oriented Autoloading in WordPress, Part 2

German (Deutsch) translation by Tatsiana Bochkareva (you can also view the original English article)

Kürzlich habe ich eine Serie abgeschlossen, in der ich Namespaces behandle und in WordPress autoloading. Wenn Sie mit den oben genannten Begriffen nicht vertraut sind, empfehle ich Ihnen, sich die Serie anzusehen.

Der Kern dessen, was Sie erwarten können, ist wie folgt:

In dieser Serie werden wir uns genau anschauen, welche PHP-Namespaces, warum sie nützlich sind und wie sie verwendet werden. Dann sehen wir uns an, wie wir mit Autoloadern die benötigten Dateien automatisch laden können, ohne sie manuell in unseren Code laden zu müssen.

Bei der Arbeit an der Serie, speziell der des Autoloaders, konnte ich nicht umhin, eine Reihe von Code-Gerüchen zu erkennen, die eingeführt wurden, als ich den Code mit Ihnen teilte.

Das heißt nicht, dass der Autoloader schlecht ist oder nicht funktioniert. Wenn Sie das Plugin heruntergeladen, ausgeführt oder mitverfolgt haben und Ihren eigenen Autoloader geschrieben haben, wissen Sie, dass es tatsächlich funktioniert.

Aber in einer Serie, die sich auf Namespaces konzentriert - etwas, das Teil der objektorientierten Programmierung ist - konnte ich nicht anders, als mich unwohl zu fühlen, den Autoloader am Ende der Serie in seinem endgültigen Zustand zu belassen.

Miss mich nicht falsch: Ich stehe immer noch zu der Serie, was abgedeckt war, und das Endergebnis dessen, was wir produziert haben. Aber vom objektorientierten Standpunkt aus gibt es mehr Arbeit, die getan werden kann. In dieser Folge werden wir das Konzept der Autoloader aus der Sicht der objektorientierten Programmierung neu beleuchten.

Konkret sprechen wir über das Konzept von:

  • Schnittstellen
  • Schnittstellenimplementierung
  • das Prinzip der einheitlichen Verantwortung
  • und andere Prinzipien und Ideen, die den Kern der objektorientierten Programmierung bilden

Es ist meine Hoffnung, dass wir unsere Autoloader bei der Fertigstellung dieser Serie nicht nur in etwas etwas Wartungsfreundlicheres und leichter lesbares, sondern auch in eine größere objektorientierte Praxis umgesetzt haben.

Mit dem gesagt, lass uns anfangen.

Anfangen

Wie bei fast jedem Post schreibe ich gerne zwei Dinge:

  1. Definieren Sie eine Roadmap, wohin wir gehen.
  2. Geben Sie alles, was Sie wissen müssen, um Ihre Maschine in Betrieb zu nehmen.

Bevor wir anfangen, irgendeinen Code zu schreiben, machen wir das jetzt.

Unsere Roadmap

In den nächsten zwei Posts werden wir uns einige objektorientierte Konzepte ansehen, die es uns ermöglichen werden, das Plugin, das wir in der vorherigen Serie erstellt haben, zu verbessern.

Wenn Sie keine Kopie dieses Plugins haben, können Sie eine Kopie davon herunterladen. Ich werde jedoch in jedem Tutorial vollständige Codebeispiele, Kommentare und Erklärungen teilen.

Die Serie wird davon ausgehen, dass Sie nichts über die Konzepte, die wir diskutieren, wissen, also werden wir von Grund auf neu beginnen. Alles, was Sie brauchen, ist genug Software auf Ihrem Rechner, um eine WordPress-Version zu erhalten und einen Editor, in dem Sie Code bearbeiten können.

Was du brauchst

Um zu beginnen, werden Sie die folgenden Werkzeuge benötigen:

Nachdem Sie all das installiert haben (und ich weiß, dass es viel zu sein scheint, aber es dauert nicht lange, bis Sie es eingerichtet haben), müssen Sie eine Kopie des oben verlinkten Plugins installieren.

Danach sind wir bereit, über Schnittstellen und das Prinzip der einheitlichen Verantwortung zu sprechen.

Schnittstellen definiert

Wenn Sie das Wort "Schnittstelle" hören, denken Sie möglicherweise an das, was der Benutzer tatsächlich auf dem Bildschirm sieht. Sie wissen: Eine Benutzeroberfläche.

Aber wenn es um objektorientiertes Design geht, reden wir überhaupt nicht darüber. Stattdessen sprechen wir über eine Klassenschnittstelle. Und dies kann normalerweise als die Klasse und die öffentlichen Methoden beschrieben werden, die es anderen Klassen zur Verfügung stellt, um damit zu kommunizieren.

Gibt es eine formellere Definition? Sicher. Wikipedia bietet eins an:

Bei der Berechnung ist eine Schnittstelle eine gemeinsame Grenze, über die zwei getrennte Komponenten eines Computersystems Informationen austauschen.

Das ist eigentlich gar nicht so schlimm. Es ist allgemein genug, um auf fast jede Programmiersprache angewendet zu werden, und es ist nicht so technisch, dass wir es nicht verstehen können.

Dann arbeiten wir wieder mit PHP. Was hat das PHP-Handbuch zum Thema zu bieten?

Mit Objektschnittstellen können Sie Code erstellen, der angibt, welche Methoden eine Klasse implementieren muss, ohne definieren zu müssen, wie diese Methoden gehandhabt werden.

Meiner Meinung nach ist das eine wirklich gute Definition. Es ist einfach. Es ist sprachunabhängig (zu meinem Wissen), und es funktioniert gut über die meisten (wenn nicht alle) objektorientierte Sprachen. Das Handbuch fährt sogar fort zu sagen:

Schnittstellen werden auf die gleiche Weise wie eine Klasse definiert, wobei jedoch das Schlüsselwort interface das Schlüsselwort class ersetzt und die Inhalte der Methoden nicht definiert sind.
Alle in einer Schnittstelle deklarierten Methoden müssen öffentlich sein. Das ist die Natur einer Schnittstelle.

Dies sind zwei Punkte, an die wir denken müssen, wenn wir unsere eigenen Schnittstellen implementieren, insbesondere wenn es um dieses Plugin geht. Wir müssen uns nämlich an Folgendes erinnern:

  1. Wir definieren eine Schnittstelle ähnlich wie eine Klasse, aber wir verwenden das Schlüsselwort interface.
  2. Die Methoden, die in einer Schnittstelle definiert sind, sind öffentlich (im Gegensatz zu protected oder private), da dies die Funktionalität garantiert, auf die andere Klassen zugreifen können.

Bevor wir weiter gehen, wie könnte ein Interface in einem WordPress-Projekt aussehen? Hier ist ein Beispiel aus einem Projekt, an dem ich gearbeitet habe:

Der obige Code sollte klar sein, zu welchem Zweck er dient, insbesondere angesichts des Kommentars, der über der Schnittstelle liegt.

Wie wir alle wissen, kann WordPress zwei Arten von Assets registrieren und in die Warteschlange stellen: Stylesheets und JavaScript-Dateien.

Da es sich bei beiden um Assets handelt, liegt es nahe, dass wir bei der Erstellung von Klassen für die Stylesheet-Verwaltung oder die JavaScript-Verwaltung diese als Asset-Schnittstelle verallgemeinern, oder?

Außerdem wissen wir, dass wir die Datei mit einer Init-Methode initialisieren wollen, damit wir die angegebene Enqueue-Funktion an die richtige WordPress-API-Funktion haken können. Alternativ können Sie auch andere Arbeiten ausführen. Wenn dies der Fall ist, können Sie der Schnittstelle eine weitere Methodensignatur hinzufügen.

Was auch immer der Fall sein mag, jede Klasse, die diese Schnittstelle implementiert, muss Funktionalität für die folgenden Methoden bereitstellen. Wie würde also eine Klasse aussehen, die diese Schnittstelle implementiert?

Hier ist ein sehr einfaches Beispiel für eine Klasse, die Stylesheets zum Administrationsbereich von WordPress hinzufügt:

Wie dies über PHP instanziiert und durchgesetzt wird, würde den Rahmen dieses Tutorials sprengen. Wir werden es reichlich sehen, wenn wir mit der Umgestaltung unseres Autoloaders beginnen.

Aber der Punkt, den ich zeigen möchte, ist, dass eine Schnittstelle die öffentlichen Methoden definiert, die eine Klasse implementieren muss. Es definiert nicht die Implementierung, aber es garantiert, dass eine bestimmte Gruppe von Funktionen existiert und öffentlich für Klassen von Drittanbietern zugänglich ist.

Das Prinzip der einheitlichen Verantwortung

Eine der Herausforderungen, über das Prinzip der einheitlichen Verantwortung zu sprechen, besteht darin, dass es oft missverstanden wird, etwa so zu denken:

Eine Klasse (oder Funktion oder Routine) sollte nur eine Sache machen.

Aber das ist ein bisschen fehlgeleitet, oder? Ich meine, sogar eine einfache for-Schleife macht mehr als eine Sache: Sie initialisiert einen Wert, vergleicht ihn mit Werten und iteriert dann den Wert, wenn der Körper der Schleife vollständig ist.

Stattdessen gibt das Prinzip Folgendes an:

Eine Klasse sollte nur einen Grund haben, sich zu ändern.

Da so viele von uns Entwicklern Google nutzen, um uns bei unserer täglichen Arbeit zu unterstützen, ist es meiner Meinung nach wichtig, die Quelle dieser Idee zu verstehen. Das heißt, das kam von Onkel Bob Martin, wie er zufällig genannt wird, oder Robert Martin, der eine Reihe von Programmierbüchern der Spitzenklasse verfasst hat.

Die Vorstellung, dass eine Klasse nur einen Grund hat, sich zu verändern, birgt eine ganze Reihe von Implikationen, nicht wahr? Hier ist ein Beispiel, das unserem Autoloader heute so einfällt.

Lassen Sie uns den Code (und ich weiß, es ist keine Klasse, es ist eine Funktion, aber das Prinzip ist anwendbar):

In dieser Funktion passiert eine Menge. Betrachtet man es von einem hohen Level, können wir sehen, dass es folgendes tut:

  • Es bestimmt, ob PHP versucht, den Code in dieser Funktion aufzurufen.
  • Die Funktion bestimmt, ob wir eine Schnittstelle oder eine Klasse laden.
  • Der Autoloader versucht dann, die Datei einzuschließen, oder er wirft einen Fehler auf.

Wenn eine Klasse nur einen Grund hat, sich zu ändern, gibt es drei Gründe (und das ist nur auf einem hohen Niveau), bei denen sich diese einzelne Funktion ändern könnte. Darüber hinaus könnte der Code auch klarer sein.

Ich bin nicht einer, der vor Code-Kommentaren zurückschreckt, aber im obigen Code gibt es viele Erklärungen. Und es ist in Ordnung, wenn Sie gerade erst anfangen, einen Autoloader zu schreiben, aber wenn Sie in fortgeschrittenere Regionen wie wir vordringen, dann wird das nicht den rigoroseren Architekturen standhalten.

Bringt die zwei zusammen

Hier können Schnittstellen und das Prinzip der einheitlichen Verantwortung Hand in Hand gehen.

So wie eine Schnittstelle eine Reihe von Funktionssignaturen (oder einen Vertrag) für die von ihren Implementierern bereitgestellten Funktionen bereitstellt, kann sie sicherstellen, dass jede Klasse, die diese Schnittstelle implementiert, strikt an dem festhält, was sie definiert.

Aber das wirft eine interessante Frage auf: Sollten wir mehrere Schnittstellen haben? Die Antwort ist, dass dies von der Art der Lösung abhängt, die Sie erstellen möchten.

In unserem Fall finde ich es sinnvoll.

Schließlich suchen wir nach einem eingehenden Klassennamen und ermitteln, ob es sich um eine Schnittstelle oder eine Klasse handelt oder ob es einen Fehler zu schreiben verdient. Darüber hinaus möchten wir sicherstellen, dass die richtige Datei im Rest des Systems enthalten ist.

Aber das ist über das Thema dieses speziellen Tutorials hinaus und eines, das wir vertiefen müssen, wenn es darum geht, mehr Code zu schreiben.

Fazit

An dieser Stelle haben wir die notwendigen Konzepte behandelt, sodass wir mit der Umgestaltung unseres Autoloaders beginnen können. Das heißt, wir werden eine Schnittstelle einführen, die sicherstellt, dass unser Code sich daran hält, und dann stellen wir sicher, dass unsere Klasse (oder Klassen) und ihre jeweiligen Methoden dem Grundsatz der einheitlichen Verantwortlichkeit entsprechen.

Darüber hinaus stellen wir sicher, dass es im Kontext des Plugins weiterhin gut funktioniert, ordnungsgemäß dokumentiert ist und den WordPress-Codierungsstandards entspricht.

In der Zwischenzeit, wenn Sie mehr über objektorientierte Programmierung im Kontext von WordPress lesen möchten, finden Sie alle meine früheren Tutorials auf meiner Profilseite. Fühlen Sie sich frei, mir auf meinem Blog zu folgen oder mir auf Twitter zu folgen, wo ich häufig über beide spreche.

Wie immer, wenn du nach anderen Hilfsprogrammen suchst, die dir helfen, deine wachsenden Tools für WordPress zu entwickeln oder zum Beispiel Code, um in WordPress besser zu lernen und zu lernen, vergiss nicht zu sehen, was wir in Envato Market haben.

Mit diesen Worten wird das nächste Tutorial in der Serie viel praktischer sein. Das heißt, wir werden Code schreiben, vorhandenen Code umgestalten und alles anwenden, was wir in diesem Tutorial gelernt haben. Bis dahin, zögern Sie nicht, irgendein Feedback in den Kommentaren zu hinterlassen.

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.