Zwei Möglichkeiten zur Entwicklung von WordPress-Plugins Funktionale Programmierung

Dieser zweite Teil einer Serie betrachtet zwei verschiedene Programmierstile (manchmal auch als Programmierparadigmen bezeichnet), die Sie beim Schreiben von WordPress-Plug-Ins verwenden können. In Teil eins behandelte Tom McFarlin die objektorientierte Programmierung. In diesem Teil betrachten wir die funktionale Programmierung.

Da das Erfahrungsniveau der Leser unterschiedlich ist, werden wir über das Programmieren auf hohem Niveau sprechen. Wenn Sie also Anfänger sind, sollten Sie kein Problem damit haben. Wenn Sie jedoch ein erfahrener Entwickler sind, finden Sie später im Artikel weitere nützliche Informationen.


Was ist funktionale Programmierung??

Funktionale Programmierung ist wahrscheinlich der Stil, mit dem Sie am meisten vertraut sind - und fast überall - der Stil, der in den verschiedenen WordPress-Code-Snippet-Websites verwendet wird, die im Internet schwimmen. Aus diesem Grund kann es manchmal als "Einsteiger" -Programmierung angesehen werden: der Stil, der von Anfängern verwendet wird, bis sie gelernt haben, objektorientierte Programmierung zu beherrschen. Dies ist unglaublich irreführend, da die funktionale Programmierung zwar viel einfacher ist, an sich aber nicht minderwertig ist.

Die funktionale Programmierung betont die Bewertung von Funktionen und vermeidet die Vorstellung von Zuständen oder Objekten im Gegensatz zur objektorientierten Programmierung, die das Nachdenken über Code anregt, der auf Objekte wirkt, Methoden verwendet, um diese Objekte zu ändern oder mit ihnen zu interagieren. Schauen wir uns ein sehr einfaches Beispiel an, in dem die beiden Stile verglichen werden:

 // Funktionale Methode function add_two ($ n) return $ n +2;  $ a = 2; $ b = add_two ($ a); // $ b = 4; // Objektorientierte Methodenklasse Number var $ value = 0; Funktion __construct ($ a) $ this-> value = $ a;  Funktion add_two () $ this-> value = $ this-> value +2;  $ a = neue Nummer (2); echo $ a-> value; // Druckt 2 $ a-> add_two (); echo $ a-> value; // druckt 4

Dieses sehr einfache Beispiel veranschaulicht den grundlegenden Stilunterschied der beiden Paradigmen: Funktionale Programmierung konzentriert sich auf die Weitergabe von Argumenten an und das Empfangen von Werten aus Funktionen. Es gibt keine 'Objekte', auf die gehandelt wird, sondern nur Parameter und Rückgabewerte. Umgekehrt weist der objektorientierte Ansatz einem Objekt verschiedene Eigenschaften zu (in unserem Fall einen 'Wert'), und Methoden wirken auf diese Eigenschaften ein.


Funktionen: Die Grundlagen

Das Definieren von Funktionen ist sehr einfach:

 Funktion add ($ number, $ number2 = 1) // Code ausführen, der auf übergebene Variablen wirkt $ sum = $ number + $ number2; // Optional, falls erforderlich, können Sie einen Wert zurückgeben. Return $ sum; 

Sobald die Funktion deklariert ist, kann sie überall in Ihrem Plug-In verwendet werden, dh sie hat globalen Geltungsbereich.

 $ a = 4; $ b = 7; Echo addieren ($ a, $ b); // druckt 11
Funktionen müssen eindeutige Namen haben. Das erneute Deklarieren einer Funktion führt zu einem Fehler. Da Ihr Code neben anderen Plug-Ins, Designs und WordPress selbst ausgeführt wird, sollten Sie niemals generische Namen verwenden. Stattdessen sollten Sie Ihren Funktionsnamen etwas Einzigartiges voranstellen (z. B. den Namen Ihres Plug-Ins)..

Sie haben das vielleicht bei der Definition von bemerkt hinzufügen, Das zweite Argument wird gleich gesetzt 1. Dies setzt einen Standardwert für $ number2 (in diesem Fall 1) und macht das Argument dadurch optional. Wenn das Argument nicht angegeben wird, wird der Wert als Standardwert verwendet:

 Echoaddition (4); // Druckt 5 echo add (4, 1); // druckt 5

Andererseits wird für den ersten Wert kein Standardwert angegeben. Wenn Sie dieses Argument weglassen, wird ein Fehler ausgegeben

 Echo add (); // Löst einen Fehler aus, da $ number nicht definiert ist

Sie können auch eine variable Anzahl von Argumenten haben. Innerhalb der Funktion können wir verwenden func_num_args () um die Anzahl der erhaltenen Argumente zu erhalten, während func_get_arg () ermöglicht den Zugriff auf eine bestimmte übergebene Variable, die von 0 indiziert ist.

 function sum () // Liefert die Anzahl der Argumente für sum () $ number_args = func_num_args (); $ summe = 0; if (! $ number_args) gibt $ sum zurück; für ($ i = 0; $ i < $number_args; $i++ )  $sum += func_get_arg( $i );  return $sum;  echo sum( 1, 2, 3, 4 ); //Prints 10 echo sum( 1, 2 ); //Prints 3 echo sum(); //Prints 0

Das Obige kann auch in Objektmethoden verwendet werden. Wenn Sie eine Variable als 'global' deklarieren, können Sie auf die Variable innerhalb einer Funktion zugreifen.

 $ a = 'Hallo'; $ b = 'Welt'; function hello_world () // Dies ist notwendig, um auf $ a und $ b // zuzugreifen, die außerhalb des Funktionsumfangs deklariert sind. global $ a, $ b; $ b = $ a. ". $ b; hello_world (); echo $ b; // Druckt 'Hallo Welt'
Von der Verwendung von Globals wird generell abgeraten. Insbesondere da zwei Plug-Ins, die denselben Namen für eine globale Variable verwenden, dazu führen können, dass eines oder beide Plug-Ins beschädigt werden. Wenn Sie eine globale Variable verwenden müssen, stellen Sie erneut sicher, dass sie eindeutig ist, indem Sie den Namen Ihres Plug-Ins voranstellen.

Warum sollten Sie die funktionale Programmierung verwenden??

Die Wahl des zu verwendenden Programmierstils hängt von der Beurteilung ab - und von der persönlichen Präferenz. Es ist nicht richtiger oder falsch, funktionale statt objektorientierte Programmierung zu verwenden, aber meistens gibt es einen Stil, der für das, was Sie erreichen wollen, besser geeignet ist.

Objektorientierte Programmierung ist manchmal einfach nicht notwendig und führt nur zu kompliziert zu einem Problem oder führt überflüssigen Code ein. Ein Beispiel könnten die verschiedenen 'Utility'-Funktionen sein, die WordPress bietet. Dies sind generische Funktionen, die einen bestimmten Zweck erfüllen. Zum Beispiel wp_trim_words ($ text, $ num_words) schneidet die angegebene Zeichenfolge einfach auf eine bestimmte Größe (in Worten). Es würde nichts hinzufügen, um zu definieren wp_trim_words () stattdessen als eine Methode, die zu einem Objekt gehört, und würde zu hässlicherem Code führen. Bei der Funktionsprogrammierung dauert es eine Zeile.

Ein Vorteil der funktionalen Programmierung, insbesondere für Anfänger, ist die Einfachheit. Sie müssen sich nicht um statische, private oder geschützte Funktionen kümmern - sie sind alle global. Der Begriff der statischen Variablen existiert auch nicht. Auf ganz grundlegender Ebene gibt Ihre Funktion eine Ausgabe zurück, die von dem, was Sie erhalten haben, abgeleitet ist. Zum Beispiel, get_the_title (7) gibt den Titel für den Beitrag mit der ID 7 zurück.

Ein weiterer Vorteil der funktionalen Programmierung besteht darin, dass Funktionen global zugänglich sind. Bei objektorientierten Programmen müssen Sie dieses Objekt umgehen, um auf ein bestimmtes Objekt zu reagieren. Dies kann manchmal schwierig sein. Um dies zu veranschaulichen, nehmen wir ein Beispiel aus dem ersten Teil:

 class DemoPlugin public function __construct () add_action ('wp_enqueue_scripts', array ($ this, 'register_plugin_scripts'));  public function register_plugin_scripts () // Plugin-Skripts registrieren $ demo_plugin = new DemoPlugin ();

Wenn WordPress das speichert register_plugin_scripts () Methode, damit es aufgerufen werden kann, wenn die wp_enqueue_scripts action wird ausgelöst, indem nicht nur die Methode, sondern auch das Objekt referenziert wird $ demo_plugin. Dies liegt daran, dass dieselbe Methode für verschiedene Instanzen eines Objekts berücksichtigt wird anders Methoden - das ist, $ demo_plugin-> register_plugin_scripts () und $ copy_of_demo_plugin-> register_plugin_scripts () sind nicht das Gleiche. Das mag seltsam erscheinen - aber Methoden können sich für verschiedene Instanzen derselben Klasse unterschiedlich verhalten, daher müssen wir sowohl auf die Methode als auch auf die Instanz verweisen.

Aber warum ist das wichtig? Dies macht es sehr schwer für ein Drittanbieter-Plug-In oder ein Design, diese Methode aufzuheben, da sie dazu Folgendes aufrufen müssen:

 remove_action ('wp_enqueue_scripts', array ($ demo_plugin, 'register_plugin_scripts'));

Aber im Allgemeinen haben sie keinen Zugriff auf die $ demo_plugin Variable. (Hinweis: Wenn die Methode als statisch deklariert ist, können Sie dies umgehen.).


Objektorientierte und funktionale Programmierung in WordPress

Natürlich hat die objektorientierte Programmierung ihre Vorteile, wie im ersten Teil erläutert. Wie auch Tom erwähnt, ist es bei der Verwendung der Widget-API von WordPress nicht zu vermeiden. Ein anderes allgemeines Beispiel ist WP_Query (). Hier ist eine objektorientierte Vorgehensweise eindeutig die beste: Sie haben ein Objekt (in diesem Fall eine Abfrage), das verschiedene Eigenschaften hat (z. B. Suchkriterien, Informationen zur Paginierung, übereinstimmende Ergebnisse), und Sie möchten auf diese Abfrage eingehen (analysieren, generieren) und bereinigen Sie die entsprechende SQL und geben Sie die Ergebnisse zurück.).

WP_Query () zeigt, wie leistungsfähige objektorientierte Programmierung bei richtiger Anwendung sein kann. Nach dem Initiieren der Abfrage:

 $ the_query = new WP_Query (array (…));

Sie können nicht nur auf die Ergebnisse zugreifen, sondern auch auf andere Informationen, z. B. Paginierungswerte: Wie viele Ergebnisseiten, welche Seite angezeigt wird, die Gesamtzahl der Ergebnisse und die Art der Abfrage, z. $ the_query-> is_search (), $ the_query-> is_single () usw. Es gibt auch die gesamte "Loop" -Infrastruktur.

 if ($ the_query-> have_posts ()) echo '
    '; while ($ the_query-> have_posts ()): $ the_query-> the_post (); // Das Schleifenecho
  • '. get_the_title ($ the_post-> ID). '
  • '; endtime; Echo '
'; wp_reset_postdata ();

Das verbirgt das interne Jonglieren von Ergebnissen und Globalen hinter einer benutzerfreundlichen API.

Also was ist mit? get_posts ()? Dies dient nur als Hülle für WP_Query (), und gibt einfach ein Array von Posts zurück, die der Abfrage entsprechen. Als solches bekommen Sie nicht die "Schnickschnack" von WP_Query (), aber es ist etwas effizienter. Also, ob du verwenden solltest get_posts () oder WP_Query () hängt von Ihrem Anwendungsfall ab (z. B., ob Sie eine Paginierung benötigen oder nicht), aber es hängt auch von Ihren persönlichen Vorlieben ab.

 $ results = get_posts (array (…)); if ($ result) echo '
    '; foreach ($ resultiert als $ the_post) echo '
  • '. get_the_title ($ the_post-> ID). '
  • '; Echo '
';

Zusammenfassung

Hoffentlich haben diese beiden Artikel dazu beigetragen, die Vor- und Nachteile dieser Programmierstile herauszustellen. Der entscheidende Punkt ist, dass es hier kein Recht und Unrecht gibt und dass jeder Programmierer seine persönlichen Vorlieben hat. Einige Kontexte eignen sich jedoch eher für einen bestimmten Programmierstil. Daher sollten Sie davon ausgehen, dass Ihr Plug-In eine Mischung aus beiden enthält.