WordPress: vom Einstieg bis zur Entwicklung · Modul 2: PHP-Grundlagen für WordPress

Lektion 4 von 5Text 16 Min.

Objektorientierung, Namespaces und Composer

Lernziele
  • Klassen, Objekte, Eigenschaften und Methoden verstehen
  • moderne PHP-Merkmale wie Konstruktor-Promotion und Typen einsetzen
  • Namespaces nutzen, um Konflikte zu vermeiden
  • mit Composer Abhängigkeiten und automatisches Laden einrichten

Kleine Anpassungen lassen sich gut mit einzelnen Funktionen schreiben. Sobald ein Plugin wächst – mit eigenen Inhaltstypen, Einstellungen, Schnittstellen und Hintergrundaufgaben –, wird eine Sammlung loser Funktionen schnell unübersichtlich. Objektorientierte Programmierung hilft, Code in sinnvolle Einheiten zu gliedern: Klassen, die zusammengehörige Daten und Funktionen bündeln. Moderne WordPress-Plugins nutzen dazu Namespaces, um Konflikte mit anderen Plugins zu vermeiden, und Composer, um Abhängigkeiten zu verwalten und Klassen automatisch zu laden. Diese Lektion zeigt die Grundlagen – genug, um moderne Plugins zu lesen und eigene sauber aufzubauen.

1. Klassen und Objekte

Definition 4.1
Klasse und Objekt
Eine Klasse ist ein Bauplan, der festlegt, welche Eigenschaften (Daten) und Methoden (Funktionen) etwas hat. Ein Objekt ist ein konkretes Exemplar dieses Bauplans mit eigenen Werten, erzeugt mit new.
Abb. 4.1Klasse und Objekte
Klasse Kurs (Bauplan)titel: stringplaetze: intpreis: floatbuchen()istAusgebucht()Objekt: Yoga12 Plätze · 19,90 €Objekt: Pilates0 Plätze · 22 €Objekt: Meditation8 Plätze · 12 €new Kurs( … ) erzeugt Objekte
Abb. 4.1Eine Klasse beschreibt einmal, was ein Kurs ist und kann. Daraus entstehen beliebig viele Objekte mit eigenen Werten.
DurchlaufEine Klasse für Kurse
Kurs.php
1<?php
2class Kurs {
3 public function __construct(
4 public readonly string $titel,
5 private int $plaetze,
6 ) {}
7
8 public function buchen(): bool {
9 if ( $this->plaetze === 0 ) {
10 return false;
11 }
12 $this->plaetze--;
13 return true;
14 }
15}
16
17$yoga = new Kurs( 'Yoga am Morgen', 1 );
18echo $yoga->buchen() ? 'gebucht' : 'voll';
19echo ' / ';
20echo $yoga->buchen() ? 'gebucht' : 'voll';

Variablen

Ausgabe

 
Schritt 1/4: Die Klasse Kurs hat einen Konstruktor. Seit PHP 8 können Eigenschaften direkt in seinen Parametern angelegt werden (Konstruktor-Promotion). readonly bedeutet: nach dem Anlegen unveränderlich.

Die Sichtbarkeit steuert, wer auf Eigenschaften und Methoden zugreifen darf. public ist von überall erreichbar, private nur innerhalb der Klasse, protected zusätzlich in abgeleiteten Klassen. So wird verhindert, dass anderer Code die Plätze direkt verändert – das geht nur über die Methode buchen(), die dabei die Regeln einhält.

2. Namespaces

Wie bei Funktionen dürfen auch Klassennamen in WordPress nicht mit anderen Plugins kollidieren. Namespaces lösen das elegant: Sie sind wie Ordner für Code. Die Klasse Kurs im Namespace Studio\Buchung heißt vollständig Studio\Buchung\Kurs und kollidiert nicht mit einer Klasse Kurs in einem anderen Plugin.

src/Buchung/Kurs.php
1<?php
2namespace Studio\Buchung;
3
4use WP_Post; // Klassen aus dem globalen Namensraum importieren
5
6class Kurs {
7 public static function aus_beitrag( WP_Post $beitrag ): self {
8 return new self( $beitrag->post_title, (int) get_post_meta( $beitrag->ID, 'plaetze', true ) );
9 }
10 // …
11}
VorhersageWas passiert hier?
plugin.php
1<?php
2namespace Studio\Buchung;
3
4function hallo(): string { return 'Studio'; }
5
6echo \Studio\Buchung\hallo() . ' ' . hallo();
Was gibt dieser Code aus? Wählen Sie eine Antwort.

3. Composer

Definition 4.2
Composer
Das Standardwerkzeug zur Verwaltung von Abhängigkeiten in PHP. Es installiert benötigte Bibliotheken, hält ihre Versionen fest und erzeugt einen Autoloader, der Klassen automatisch lädt, sobald sie gebraucht werden.

Ohne Composer müsste jede Klassendatei mit require eingebunden werden. Mit Composer genügt eine Zeile im Haupt-Plugin, und alle Klassen im Ordner src werden bei Bedarf geladen – vorausgesetzt, Ordner und Dateinamen folgen dem Namespace. Diese Konvention heißt PSR-4. Zusätzlich kann Composer fremde Bibliotheken einbinden, etwa für PDF-Erzeugung oder HTTP-Anfragen. Klicken Sie sich durch die Einrichtung:

Klick-GrafikEin Plugin mit Composer einrichten
composer.jsoncomposer installvendor/autoloadKlassen nutzen
Schritt 1/4 · Konfiguration: composer.json legt Namen, benötigte Bibliotheken und die Zuordnung Namespace → Ordner fest.
composer.json
1{
2 "name": "studio/buchung",
3 "require": { "php": ">=8.1" },
4 "autoload": {
5 "psr-4": { "Studio\\Buchung\\": "src/" }
6 }
7}
Moderne Plugins bündeln Code in Klassen, legen sie in einen eigenen Namespace und laden sie mit dem Composer-Autoloader. Das verhindert Konflikte und hält auch große Plugins übersichtlich.

4. Moderne PHP-Merkmale

Tab. 4.1Nützliche Neuerungen seit PHP 8
MerkmalBeispielNutzen
Konstruktor-Promotionpublic function __construct( private int $plaetze ) {}weniger Schreibarbeit
readonlypublic readonly string $titelunveränderliche Werte
Benannte Argumenteround( num: $x, precision: 2 )lesbare Aufrufe
Nullsafe-Operator$kurs?->leitung?->namekeine Fehler bei null
matchmatch ( $status ) { … }strenger, kürzer als switch
Enumsenum Status: string { case Frei = 'frei'; }feste Werte statt Texte

5. Wann Objektorientierung, wann nicht?

Nicht jedes Stück Code braucht Klassen. Für ein kleines Plugin mit zwei Hooks sind einfache, gut benannte Funktionen völlig in Ordnung. Klassen lohnen sich, wenn Daten und Verhalten eng zusammengehören – etwa ein Kurs mit Plätzen und Buchungslogik –, wenn mehrere Teile eines Plugins dieselben Abhängigkeiten nutzen oder wenn Code getestet werden soll. Ein häufiger Fehler ist, alles in eine riesige Klasse mit dutzenden Methoden zu packen. Besser sind mehrere kleine Klassen mit klaren Aufgaben: eine für den Inhaltstyp, eine für die Einstellungen, eine für die REST-Schnittstelle.

ErkundenAufbau eines modernen Plugins
studio-buchung.phpPlugin.phpKurs/Inhaltstyp.phpRest/Endpunkte.phpAdmin/Einstellungen.php
studio-buchung.php: Hauptdatei mit Plugin-Kopf. Lädt den Autoloader und startet das Plugin – mehr nicht. (1/5 erkundet)

6. Ein Beispiel

Ein Yogastudio ließ sich ein Buchungs-Plugin entwickeln. Anfangs bestand es aus einer Datei mit vierzig Funktionen; jede Änderung war riskant, weil niemand den Überblick hatte. Beim Umbau entstanden ein Namespace Studio\Buchung, Klassen für Kurs, Buchung, Warteliste, Einstellungen und REST-Schnittstelle sowie ein Composer-Autoloader. Die Buchungslogik steckt nun in der Klasse Kurs mit der Methode buchen(), die immer dieselben Regeln einhält – egal ob über die Website, die REST API oder später einen KI-Agenten gebucht wird. Neue Funktionen wie eine Warteliste ließen sich seitdem in einer eigenen Klasse ergänzen, ohne den übrigen Code anzufassen.

7. Häufige Fragen

Muss ich Composer auf dem Server installieren? Nicht unbedingt. Composer wird meist auf dem Entwicklungsrechner ausgeführt, und der erzeugte Ordner vendor wird mit dem Plugin ausgeliefert. Wichtig ist, nur die für den Betrieb nötigen Pakete mitzuliefern und Entwicklungswerkzeuge auszuschließen, etwa mit composer install --no-dev.

Was passiert, wenn zwei Plugins dieselbe Bibliothek in verschiedenen Versionen mitbringen? Das ist ein bekanntes Problem in WordPress, weil alle Plugins im selben PHP-Prozess laufen. Es kann zu schwer auffindbaren Fehlern führen. Größere Plugins lösen es, indem sie die Namespaces ihrer Abhängigkeiten mit Werkzeugen wie PHP-Scoper umschreiben. Für kleine Plugins gilt: so wenige Fremdbibliotheken wie möglich.

Nutzt WordPress selbst Objektorientierung? Ja, zunehmend. Klassen wie WP_Query, WP_Post, WP_REST_Controller oder die Abilities API sind objektorientiert. Viele ältere Teile sind noch funktional aufgebaut, weil WordPress großen Wert auf Rückwärtskompatibilität legt. Für eigene Plugins ist ein moderner, objektorientierter Aufbau heute der Standard.

8. Übung zum Selbermachen

Wandeln Sie die Funktion aus der vorigen Übung in eine Klasse um. Legen Sie in WordPress Playground einen Namespace Uebung an, eine Klasse Kurs mit Titel, Plätzen und Preis als Eigenschaften über Konstruktor-Promotion und eine Methode istAusgebucht(). Eine zweite Klasse Kursliste nimmt mehrere Kurse entgegen und hat eine Methode alsHtml(). Überlegen Sie, welche Eigenschaften öffentlich sein sollen und welche besser privat bleiben. Wer Composer lokal installiert hat, kann das Ganze als kleines Plugin mit composer.json und Autoloader aufbauen – genau so, wie es Modul 4 für echte Plugins zeigt. Der Vergleich mit der funktionalen Fassung macht deutlich, wann Objektorientierung Klarheit bringt und wann sie für kleine Aufgaben zu viel ist.

Quellen und weiterführende Literatur
  1. [1]The PHP Group (2026): PHP Manual – Classes and Objects; Namespaces; Enumerations. php.net/manual.
  2. [2]Composer (2026): Documentation – Basic Usage; Autoloading. getcomposer.org.
  3. [3]PHP-FIG (2026): PSR-4 Autoloader. php-fig.org/psr/psr-4.
  4. [4]WordPress.org (2026): Plugin Handbook – Best Practices; Plugin Basics.

Stand: September 2026, WordPress 7.1, PHP 8.3. Kursmaterial der Klarwerk Akademie. WordPress entwickelt sich schnell – maßgeblich ist die aktuelle Dokumentation auf developer.wordpress.org.

Abschlussquiz

Drei Fragen – dann ist die Lektion geschafft.

Frage 1 von 3

Was erzeugt new Kurs( … )?