Verwenden von Klassen anstelle globaler Funktionen in functions.php

11

In vielen Themen, die ich gesehen habe (einschließlich TwentyEleven), und in den Beispielen, die ich online gefunden habe, werden beim Erstellen der functions.phpDatei für ein Thema alle Funktionen in einem globalen Bereich deklariert. Zur Verdeutlichung sieht eine typische Funktionsdatei folgendermaßen aus:

function my_theme_do_foo() { // ... }

function my_theme_do_bar() { // ... }

add_action( 'foo_hook', 'my_theme_do_foo' );

Es scheint mir, dass die Dinge ein wenig besser "eingekapselt" werden könnten, wenn eine Klasse verwendet würde:

class MyTheme {
    function do_foo() { // ... }
    function do_bar() { // ... }
}

$my_theme = new MyTheme();

add_action( 'foo_hook', array( &$my_theme, 'do_foo' ) );

Die Vorteile des zweiten Ansatzes (in meinen bescheidenen Augen):

  • Kürzere Funktionsnamen
  • Zugriff auf Instanzvariablen (der größte Vorteil IMO)
  • Keine globalen Funktionen

Die Nachteile:

  • Der Klassenname kann weiterhin Konflikte verursachen
  • Nicht so klar, mit einem untergeordneten Thema "anzupassen" (müsste eine übergeordnete Klasse erweitern)
  • Die meisten Themen haben es nicht so gemacht, also würden Sie sich dem Trend widersetzen

Ich übersehen wahrscheinlich einige Dinge, aber ich frage mich, warum ich nicht den OOP-Ansatz wählen sollte. Es fühlt sich für mich ein bisschen "sauberer" an, wenn überhaupt. Vielleicht irre ich mich?

Ich bin ziemlich neu in der Entwicklung von WordPress-Themes, also vergib mir, wenn dies in der WP-Community allgemein bekannt ist :). Ich versuche nur zu lernen, warum die Dinge so sind, wie sie sind.

Andy Adams
quelle
Sie können Themen von Kovshenin überprüfen - wordpress.org/extend/themes/profile/kovshenin er verwendet OOP-Ansatz in functions.php
Mamaduka

Antworten:

9

Die Verwendung einer Klasse für die Kapselung ist ein sehr häufiger Ansatz einer Reihe von Entwicklern für Plugins. Ich mache das und finde es sauberer. Aber für Plugins. Themen sind von Natur aus prozeduraler.

Wir tun dies nicht für Standard-WordPress-Themes, da dies die Eintrittsbarriere erhöht. Die Funktionen sind recht einfach. Das Entfernen von Aktionen, die an Klassen gebunden sind, kann schwierig sein (und unter bestimmten Umständen möglicherweise fehlerhaft sein).

Außerdem sind eine Reihe von Funktionen in den Standardthemen steckbar. Das Erweitern einer Klasse und das Ersetzen der Methoden ist weitaus komplizierter als nur das Definieren der Funktion. Während zwei verschiedene Aspekte des Codes unterschiedliche Funktionen ersetzen können, können Sie Klassen nicht dynamisch erweitern. Wie Sie bereits betont haben, ist die Notwendigkeit, eine Elternklasse zu erweitern, definitiv ein Nachteil.

Ich dachte darüber nach, Twenty Eleven's Themenoptionen zu einer Klasse zu machen, kam aber nie dazu. Diese Art von separater, Plugin-ähnlicher Funktionalität scheint ein guter Kandidat für die Kapselung zu sein.

Andrew Nacin
quelle
Danke für die Antwort, Nacin. Ich hatte nicht über die Schwierigkeit nachgedacht, Aktionen mit Klassen zu "lösen". In Bezug auf die Kapselung von Optionen haben wir dasselbe gedacht: github.com/jestro/struts
Andy Adams