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

In diesem Tutorial machen wir eine Pause vom Schreiben von Code und schauen uns an, was PHP-Namespaces und Autoloader sind, wie sie funktionieren und warum sie von Vorteil sind. Dann bereiten wir uns darauf vor, diese Serie zusammenzufassen, indem wir sie in Code implementieren.

Wenn Sie sich zu diesem Punkt nicht mit allem befasst haben, was wir in der Serie behandelt haben, empfehle ich Ihnen, zurückzuschauen und zu überprüfen, was wir bisher gemacht haben. Zumindest den vorherigen Artikel durchsehen, da er die Grundlage dafür legt, worüber wir in den nächsten beiden Artikeln sprechen werden.

Nun, da Sie aufgeholt sind, kennen Sie das Plugin, an dem wir gearbeitet haben, was es macht und wie es funktioniert. Außerdem sollte eine lokale Entwicklungsumgebung eingerichtet sein, in der Sie mit dem Quellcode arbeiten können. Wenn nicht, hier ein kurzer Überblick über alles, was Sie brauchen:

  • Eine lokale Entwicklungsumgebung, die PHP 5.6.20, den Apache-Webserver und einen MySQL-Datenbankserver umfasst.
  • Ein Verzeichnis, in dem WordPress 4.6 gehostet wird.
  • Ein Texteditor oder eine IDE Ihrer Wahl, mit der Sie ein Plugin schreiben können.
  • Grundkenntnisse der WordPress Plugin API.

Vorausgesetzt, Sie haben all das installiert, eingerichtet und sind bereit, die neueste Version des Plugins zu verwenden. Dann können wir unsere Diskussion über Namespaces, Autoloading und WordPress-Plugins fortsetzen.

Namensräume und Autoloading

Für diejenigen, die in anderen modernen Programmiersprachen gearbeitet haben, sind Sie möglicherweise mit dem Konzept von Namespaces vertraut. Aber selbst wenn Sie mit PHP gearbeitet haben, ist es unwahrscheinlich, dass Sie sie zumindest im Kontext von WordPress häufig gesehen haben.

Für die von euch, welche nicht haben von ihnen oder von wem gehört haben von ihnen gehört, sie aber nicht verwendet, darum geht es in diesem Artikel. Im Besonderen werden wir über Namespaces und automatisches Laden sprechen. Im nächsten Tutorial werden wir sehen, wie alles zusammenpasst.

Das heißt, wir werden die bisher mit unserem Plugin geleistete Arbeit übernehmen und dann aktualisieren, so dass Namespaces und Autoloading verwendet werden. Dadurch erhalten Sie ein praktisches Verständnis der Konzepte sowie einige neue Werkzeuge, die Sie Ihrem Entwicklungsrepertoire hinzufügen können, wenn Sie an Ihrem nächsten Projekt arbeiten.

Was sind Namespaces??

Wie bei den meisten meiner Tutorials gebe ich gerne die formale Definition und zerlege sie dann in Konversationsbegriffe. Das PHP-Handbuch definiert Namespaces folgendermaßen:

In der weitesten Definition sind Namespaces eine Möglichkeit, Elemente einzukapseln. 

Das hilft uns nicht unbedingt viel, oder? Man könnte argumentieren, dass Klassen dasselbe tun, dass Attribute und Funktionen als Elemente verallgemeinert werden können. Aber das Handbuch geht weiter:

PHP Namespaces bieten eine Möglichkeit, verwandte Klassen, Schnittstellen, Funktionen und Konstanten zu gruppieren.

Das ist ein bisschen klarer, richtig? Das heißt, wenn wir eine Gruppe verwandter Klassen haben, gruppieren wir sie möglicherweise im selben Verzeichnis oder in ähnlichen Verzeichnissen im Dateisystem. Dies kann jedoch nicht anhand des Codes festgestellt werden.

Namensräume geben uns die Möglichkeit, dies zu tun.

Stellen Sie sich das so vor: Stellen Sie sich vor, Sie haben eine Reihe von Funktionen für die Arbeit mit CSVs. 

  • Möglicherweise haben Sie eine Klasse, die dafür verantwortlich ist, eine CSV-Datei zu lesen, den Inhalt zu analysieren und den Inhalt in ein Array zu lesen. 
  • Dann haben Sie eine Klasse, die dafür verantwortlich ist, dieses Array zu übernehmen und Daten in die Datenbank zu schreiben, je nachdem, was das Array enthält. 
  • Danach gibt es eine Klasse, die für das Lesen dieser Optionen verantwortlich ist, wann immer ein Objekt eines Drittanbieters oder ein anderer Bereich im Code die Daten lesen muss, die zuvor in der Projektausführung gelesen, analysiert und gespeichert wurden.

Alle diese Funktionen sollten sich über mehrere Klassen erstrecken. Je nachdem, wie objektorientierter Code Ihre Lösung ist, verfügen Sie möglicherweise auch über eine Reihe von Schnittstellen, die Ihre Klassen implementieren. Darüber hinaus können die Klassen in a organisiert werden / csv Verzeichnis, aber noch weiter in ihre eigenen Unterverzeichnisse unterteilt. 

  • /lesen
  • /schreiben

Vielleicht würden Sie sich entscheiden, die Struktur etwas anders zu organisieren, aber um die Diskussion so einfach wie möglich zu halten, dachte ich, dass dies sinnvoll wäre. Die Klassenschnittstelle (n) würde sich also vielleicht in der Wurzel von befinden / csv Verzeichnis würde sich der Leser in der /lesen Verzeichnis, und die Klassen, die für das Schreiben der Daten in die Datenbank verantwortlich sind, befinden sich im Verzeichnis /schreiben Verzeichnis.

Nichts, was ich bisher gesagt habe, ist in Bezug auf die Organisation unserer Dateien außergewöhnlich. Aber hier kommen Namespaces ins Spiel. 

Was wäre, wenn wir unsere Klassen so organisieren könnten, dass sie auch ihrem physischen Ort im Dateisystem zugeordnet werden?

Stellen Sie sich das so vor: Nehmen wir an, Ihr Plugin heißt Acme CSV und die oben genannten Klassen sind alle in ihren Verzeichnissen und Unterverzeichnissen usw. organisiert. Wie könnten die Namespaces für diese Klassen aussehen und wie würden sie innerhalb des Projekts deklariert??

Schauen Sie sich an, was wir das nennen Parser Klasse. Diese Klasse befindet sich in / csv / lesen.

Und dann sagen wir, wir haben unsere Klasse, die Daten in die Datenbank schreibt:

Lassen Sie uns abschließend sehen, wie der Namespace für die Klasse aussieht und Daten aus der Datenbank liest:

Nichts fürchterlich kompliziert, oder? Obwohl der Standard oben nicht wie Sie ist haben Um Ihre Dateien zu organisieren, versuche ich gerne, meine Klassen ihrem Speicherort auf der Festplatte zuzuordnen. Es erleichtert die Bezugnahme auf sie in zukünftigen Arbeiten. 

An diesem Punkt gibt es wirklich nicht viel mehr zu sehen, als eine Art Organisation Ihrer Klassen oben in ihren Dateien zu deklarieren. Wenn Sie jedoch mit dem automatischen Laden beginnen, ändert sich dies.

Ein Wort zu Paketen und Unterpaketen

Bevor wir jedoch über das automatische Laden sprechen, möchte ich einen kurzen Exkurs auf der @Paket und @subpackage Tags, die wir oft in Dateikommentaren sehen.

Zum Beispiel haben Sie wahrscheinlich etwas Ähnliches in Bezug auf unseren Code oben gesehen:

Wenn Sie sich jedoch auf die Dokumentation zu phpDocumentor beziehen, sehen Sie Folgendes @subpackage:

Dieses Tag gilt als veraltet und kann in zukünftigen Versionen von phpDocumentor entfernt werden. Es wird empfohlen, das @package-Tag für die Bereitstellung mehrerer Ebenen zu verwenden.

So @subpackage wird veraltet, was bedeutet, dass wir ihn wahrscheinlich nicht mehr verwenden sollten. Was ist mit @Paket Etikett?

Das @package-Tag wird zur Kategorisierung von Strukturelementen in logische Unterteilungen verwendet.

Die Unterstützung für das Verschachteln auf mehreren Ebenen hängt jetzt ausschließlich von diesem Tag ab. Gut zu wissen, richtig? Das bedeutet, der Code, den wir oben sehen, könnte folgendermaßen geschrieben werden:

Sicher, es ist ein einfaches Beispiel, aber es bringt es auf den Punkt. Ich erwähne das weil @subpackage ist ein weiteres Tag, das wir oft in WordPress-basierten PHP sehen, das wir vermeiden müssen, wenn wir mit der Einführung neuerer Standards beginnen wollen.

Was ist Autoloading??

Kommen wir mit den besprochenen Themen zurück. Da wir uns mit Namespaces befasst haben, sehen wir uns das automatische Laden an. Laut dem PHP-Handbuch:

Viele Entwickler, die objektorientierte Anwendungen schreiben, erstellen pro Klassendefinition eine PHP-Quelldatei. Eine der größten Belästigungen besteht darin, zu Beginn jedes Skripts eine lange Liste erforderlicher Include-Dateien schreiben zu müssen (eine für jede Klasse)..

Besser kann man das nicht sagen, oder? Es erklärt jedoch nicht wirklich, was das automatische Laden ist. Es erklärt nur das Problem, das es lösen kann.

In PHP 5 ist dies nicht mehr erforderlich. [Es unterstützt das Laden von Klassen und Schnittstellen, die automatisch geladen werden, wenn sie derzeit nicht definiert sind.

Klingt fantastisch, richtig? Aber es gibt einen Vorbehalt, den wir im nächsten Tutorial ausführlich untersuchen werden. Aber bis dahin ist es soweit: Um diese Funktionalität zu erhalten, müssen wir eine Funktion implementieren, die weiß, wo nach zu ladenden Dateien gesucht wird und wie die Verzeichnisstruktur dieser Dateien analysiert wird.

Es klingt mühsam und kann in einigen Fällen der Fall sein. Wenn Sie jedoch eine konsistente Methode zur Organisation Ihrer Arbeit haben, kann Ihr Autoloading-Code portabel sein. Das heißt, Sie können die Funktion, die Sie schreiben, in ein beliebiges PHP-Projekt übernehmen und trotzdem bereit sein.

In diesem speziellen Tutorial geht es jedoch nicht um das Schreiben von Code. Es geht darum, die Idee hinter den Konzepten des Codes zu behandeln, die wir im nächsten Tutorial implementieren werden.

Warum ist irgendetwas davon relevant??

Je nachdem, wen Sie fragen, können Sie Namespaces und das automatische Laden als neu in PHP anzeigen. Für einige ist das wahr. Für andere arbeiten sie seit einiger Zeit mit diesen beiden Konzepten.

Eines der Dinge in WordPress, die es abhalten können, neuere PHP-Funktionen zu übernehmen, ist die Abwärtskompatibilität. Dies ist nicht unbedingt eine gute oder eine schlechte Sache - es ist ein Attribut der Anwendung.

Da WordPress jedoch eine Mindestversion von PHP hat, auf der es ausgeführt wird, werden neuere Sprachfunktionen nicht immer übernommen. Und wenn diese Mindestversion ist Nach der Übernahme dauert es einige Zeit, bis WordPress-spezifische Entwickler diese Features in ihrem Code verwenden.

Und das ist keine schlechte Sache. Kurz gesagt: Die Entwickler halten mit der Anwendung in dem Tempo, in dem sie reifen.

Wenn sich WordPress jedoch weiterentwickelt oder Sie die Umgebung, in der Ihr Projekt ausgeführt wird, steuern können, sind Sie möglicherweise daran interessiert, einige der Funktionen der Sprache zu übernehmen, von denen Sie bisher nicht wussten, dass sie verfügbar waren oder die Sie vorher nicht wussten.

Namespaces und Autoloading sind zwei leistungsstarke Funktionen der Sprache, die dazu beitragen, den Code lesbarer, organisierter und noch wartbarer zu machen. Wenn Sie sie also noch in keiner Ihrer Arbeiten in WordPress verwenden möchten, insbesondere wenn Sie mit WordPress-Plugins arbeiten, sollten Sie dies unbedingt in Betracht ziehen.

Fazit

Namespaces geben uns die Möglichkeit, unseren Code so zu organisieren, dass die logische Gruppierung zusammengehöriger Klassen wesentlich vereinfacht wird. Darüber hinaus sorgt das automatische Laden für eine bessere Lesbarkeit des Codes, indem die Anzahl der Codes reduziert wird umfassen, include_once, benötigen, oder einmalig benötigt Anweisungen, die wir verwenden müssen.

Dies macht den Quellcode, den wir schreiben, klarer, da er sich ausschließlich auf die Logik konzentriert, für die er verantwortlich ist, ohne Dateien importieren zu müssen, verschiedene Verzeichnisstrukturen zu handhaben und sich dessen mehr bewusst zu sein (ganz zu schweigen von der Entwickler müssen ständig alles neu eingeben, damit sie auf eine Datei zugreifen können).

Für diejenigen, die gerne sicherstellen möchten, dass die Struktur ihres Codes der Organisationsstruktur der Dateien und Verzeichnisse auf der Festplatte entspricht, können wir unsere Projekte genau so organisieren.

Obwohl dies alles gesagt ist, ist dies nur ein Weg und einige Vorteile von Namespaces und Autoloading. Weitergehende Themen werden im PHP-Handbuch und in anderen Open-Source-Projekten behandelt, von denen ich empfehle, sie zu überprüfen, wenn Sie Zeit haben.

Im nächsten Tutorial werden wir diese Serie zusammenfassen, indem wir das anwenden, was wir in diesem Tutorial gelernt haben, während wir Namespaces und das automatische Laden in unser WordPress-Plugin einführen. Wenn Sie bis dahin nach anderem Material suchen, das mit WordPress in Verbindung steht, finden Sie alle meine vorherigen Tutorials auf meiner Profilseite und Sie können mir auf meinem Blog oder auf Twitter folgen.

Zögern Sie nicht, alle offenen Fragen zu Namespaces, automatischem Laden oder WordPress in dem unten stehenden Formular zu hinterlassen.

Ressourcen

  • Namensräume
  • Klassen automatisch laden
  • phpDocumentor