21. Objektorientierung (OOP) in WordPress Plugins

In der Developer Survey 2019 von StackOverflow wurde WordPress zur unbeliebtesten Webplattform gewählt. Das liegt nicht zuletzt daran, dass PHP selbst in der Rangliste der unbeliebtesten Sprachen immer weiter nach oben klettert. Die Programmiersprache lag im Jahr 2018 auf Platz 13, in der aktuellen Umfrage jedoch schon auf Platz 5.

Sucht man im Internet nach einer Antwort für die Frage “Warum ist PHP so unbeliebt?” findet man oft folgende Aussage:

PHP sei einfach zu erlernen, dadurch gibt es viele User die nur halbherziges Wissen über die Programmiersprache haben. Das wiederum sorge dafür, dass dieser Code oft im Internet verteilt wird.

Angeblich schlechter Code verstreue sich somit und erzeugt einen Teufelskreis. Aber ist das wirklich so?

Aus eigener Erfahrung weiß ich, dass es tatsächlich noch sehr viel sehr alten Code gibt. Dieser ist meist zehn Jahre oder älter. Der zumeist prozedural geschriebene Code ist aus der Historie stark gewachsen und ist dadurch schwer zu lesen, zu verstehen und am Ende schwierig zu pflegen. Oft kennen sich nur diejenigen aus, die permanent damit arbeiten.

Man könnte sich jetzt denken: “Alles klar. Dann mache ich einfach mit OOP weiter”. Aber das ist gar nicht so einfach. Der Grund ist, dass WordPress letztlich auch nichts mit OOP am Hut an. Zumindest fast nicht. Auch WordPress ist aus der Historie prozedural gewachsen. Es gibt zwar immer mehr objektorientierten Code in WordPress (wie z.B. die REST-API, Widgets, die neue HTTP-API) aber es gibt kein einheitliches Gesamtkonzept.

Auf der anderen Seite darf man das auch nicht zu eng sehen. Prozeduraler Code ist nicht per se schlecht. Gerade, wenn ein WordPress Plugin nicht all zu umfangreich ist, macht es keinen Sinn, objektorientiert zu programmieren weil es das Plugin an sich unnötig aufblähen würde. Hier gilt das KISS-Prinzip: “Keep it short and simple”.

Moderne Entwicklung

Keine Frage, PHP-Entwickler wollen auch moderne Programmierparadigmen nutzen die sie aus anderen Programmiersprachen kennen. PHP 7.0 und neuere Versionen machen es möglich. Nur ist WordPress trotzdem noch WordPress: die Codebasis ändert sich nicht von heute auf morgen. Es wird vorerst noch prozedural bleiben.

Mit der PHP Framework Interop Group (PHP-FIG) gibt es sogar eine Vereinigung, die genau das anstrebt: Standards finden. Viele moderne Entwickler halten sich daran. Darunter mittlerweile auch viele WordPress-Plugin-Entwickler. Passt natürlich nicht so ganz zu WordPress selbst (denn es hat seine eigenen Coding-Standards) aber man kann ja auch verschiedene Stile vermischen. Solange man konsistent bleibt ist alles in Ordnung. Bloß wie soll das gehen? Und genau darum geht es in diesem Kapitel.

Entwurfsmuster

Als Entwickler kennen Sie die verschiedenen Entwurfsmuster sicherlich. Erzeugungsmuster (z.B. Singleton), Strukturmuster (z.B. Bridge) und Verhaltensmuster (z.B. Interceptor) sind nur einige davon. Jede einzelne Macht Sinn für verschiedene Dinge, die wir durch unsere Programmierung bauen.

In diesem Kapitel möchte ich mich aber auf die Dependency Injection beschränken. Es reglementiert die Abhängigkeit eines Objekts zur Laufzeit. Möchte ein Objekt A bei seiner Initialisierung also ein anderes Objekt B initialisieren, geschieht dies nicht etwa in dem zu erzeugenden Objekt (A) sondern an einem anderen Ort.

Hört sich erst einmal kompliziert an, aber lesen Sie weiter.