Ich bereite mich gerade auf das WordCamp Torino 2018 vor. Dort werde ich zum Thema PHP 7 referieren und die Vorteile herauszustellen, die sich aus dem Update auf eine aktuelle Version des Interpreters ergeben. Allerdings werde ich mich nicht darauf beschränken, nur den Performance-Aspekt großartig auszuleuchten (auch wenn ich das keineswegs unerwähnt lassen werde), sondern ich will vor allem auf die neuen Dinge in der Programmiersprache selbst hinweisen, die einen entsprechenden Einfluss auf zukünftige Entwicklungen haben werden.
Konzept und Herausforderung
Den Vortrag habe ich in der Firma bereits in einer Session unter dem Titel „PHP – Ready for version 7“ vor einem Publikum abgehalten, welches fast vollständig aus Entwicklern bestand. Die Session dauerte etwa 30 Minuten und circa 80 % der Folien enthielten kurze Codebeispiele.
Allerdings werde ich in Turin wie schon beim WordCamp Torino 2016 nur einen Slot für einen Lightning Talk zur Verfügung haben, was mich vor die schwierige Frage gestellt hat, wie ich mein bereits bestehendes Konzept auf diese – doch recht anspruchsvolle – zeitliche Herausforderung übertragen kann.
Umdenken bei der Präsentation
Ich habe in meinem Vortrag bei MotorK etwa 25 neue Features wie bei einer Reise startend mit PHP 5.3 bis PHP 7.2 vorgestellt. Ich schreibe ganz bewusst „etwa“, weil ich auch auf neue Konstruktionen wie den Nullcoalescing Operator hingewiesen habe, der innerhalb der Neuigkeiten von PHP 7 als purer syntaktischer Zucker eingeführt wurde.
Wenn ich mich auf maximal 15 Folien beschränke, sollte das für 10 Minuten passen. Ich kann dann bequem auf eine persönliche Top 10 der neuen Sprachelemente eingehen. Eventuell kann ich die längere Version dann noch einmal für das kommende WordCamp Bologna 2018 einreichen.
Warum beginnt die Reise bei PHP 5.2?
Im Juni 2010 schrieb Mark Jaquith, dass sich die WordPress Core Entwickler darauf geeinigt hätten, den Support für PHP 4 mittelfristig einzustellen und PHP 5.2 als Mindestversion festzulegen. Die Entscheidung wurde damit begründet, dass die Entwickler der Projekte Drupal und Joomla genauso verfahren hätten. Abseits von der Frage, ob es falsch oder richtig war:
Der offizielle Support für PHP 5.2 endete im Januar 2011.
Mit PHP 5.3 als Minimalversion hätte man sich beispielsweise sofort mit anstehenden MySQL-Problemen beschäftigen müssen. Aber unterm Strich:
PHP 5.2 gehört noch heute zu den kommunizierten Mindestanforderungen von WordPress..
Meine persönliche Topliste der Neuigkeiten in PHP
Bei der Auswahl war mir wichtig, dass die neuen Elemente der Sprache wirklich eine entsprechende Wirkung entfalten und mittelfristig die Art und Weise, wie wir Code schreiben auch wirklich verändern. Durch den Fokus auf solche Elemente und des(wenn möglich) bewussten Weglassens von Ausführungen zu Inkompatibilitäten will ich die Lust auf das Entdecken und Ausprobieren wecken.
Bei der Gelegenheit will ich noch mal auf die Anhänge der Dokumentation hinweisen, die an sich recht interessant sind, wenn man sich einmal auf diese Sprachreise einlassen will.
Hier nun meine Top 10 der „New Features“:
1. Namespaces
Mit PHP 5.3 wurden Namespaces eingeführt. Das Konzept ist eigentlich ganz einfach zu verstehen und sollte speziell für die Plugins von höchstem Interesse sein. Bis dahin musste man sich mit superlangen Funktions- bzw. Klassennamen helfen, um nicht mit der WordPress-API zu kollidieren. Jetzt reicht es, eigene Namespaces zu definieren und Kopfschmerzen bei der Namensgebung sind Geschichte.
Um das Konzept zu verstehen:
Man stelle sich Verzeichnisse auf einer Festplatte vor, wo die Dateien nur den gleichen Namen haben können, wenn sie sich in verschieden Verzeichnissen befinden.
2. Type declaration
Mit PHP 5.2 war Type hinting bereits eingeführt. Es war damit endlich möglich für die Argumente von Funktionen bzw. Methoden zu bestimmen, ob es sich um ein Array oder ein Objekt einer bestimmten Klasseninstanz oder Interface sein mussten.
Ab PHP 5.4 ist es möglich, den Typ callable für Callbacks anzugeben. Die Deklaration der Typen wurde mit PHP 7.0 schließlich vervollständigt. Seitdem ist es möglich die Typen integer, string, float und boolean für Argumente festzulegen. Mit PHP 7.1 wurde zusätzlich iterable eingeführt, der entweder Arrays oder Traversable-Instanzen akzeptiert.
PHP 7.2 führte dann schließlich noch den Typen object ein.
3. Return type declaration
Als passendes Gegenstück zur vorher gelisteten Typen-Deklaration gibt es seit PHP 7.0 auch die Möglichkeit, einen Rückgabe-Typen festzulegen. Zusätzlich zu den vorher genannten Typen kann man seit PHP 7.1 void für die Rückgabe festlegen.
Außerdem gibt es 2 weitere Neuigkeiten, die auch für die vorher angesprochenen Argumente gültig sind. Zum einem kann man strict deklarieren, was sich auf das normalerweise laxe Verhalten von PHP bei numerischen Strings auswirkt. Das ist für die ganze Entwicklung nur konsequent. Außerdem kann man (auch seit Version 7.1) mit nullable festlegen, dass man auch null akzeptiert.
4. Late Static Bindings
Late Static Bindings wurden mit PHP 5.3 eingeführt. Um das Feature zu erklären, kann der unterstehende Code viel besser zum Verständnis beitragen.
Die Elternklasse Post hat eine statische Methode init definiert. So etwas sieht man auch häufig, dass ein Objekt erstellt und dann mittels add_action- oder add_filter-Callbacks in die Warteliste stellen, um dann das Object zurückzuliefern.
Hier ist das natürlich stark vereinfacht dargestellt. Aber man sieht ganz gut, dass anstelle von self das neue Schlüsselwort static benutzt wird, damit nicht immer nur die Elternklasse sondern die aufrufende Klasse ins Spiel kommt.
5. Closures
In WordPress laufen einem Callback-Funktionen eigentlich ständig über den Weg. Insofern ist das Aufgabenszenario bekannt. Wer sich zudem mit Javascript auskennt, wird die in PHP 5.3 eingeführten anonymen Funktionen bzw. Closures als ganz natürlich empfinden.
In der WordPress-Entwicklung werden Closures gern auch zusammen mit den diversen Hooks definiert. Das sieht elegant aus und wird auch gern damit begründet, dass man das Entfernen eines wichtigen Callbacks nicht zulassen will. Das weist aber natürlich auch gleich auf das damit verbundene Problem hin.
6. Errors und Exceptions in PHP 7
try und catch Blöcke trifft man in der WordPress-Welt nicht so häufig an, was eigentlich schade ist. Das wird sich mit den aktuelleren Versionen des Interpreters hoffentlich ändern. Die bereits eingeführten Exceptions sind nun mit den neu eingeführten Error-Klassen unter dem Interface Trowable eingeordnet.
In der Vergangenheit musste man einfach seinen Frieden mit dem Fakt machen, dass ein Fatal Error zum Abbruch der Ausführung eines PHP-Skriptes führt. Nun lassen sich auch solche Fehler fangen und behandeln.
7. Generatoren
Generatoren sind seit PHP 5.5 ein einfacher Weg einen simplen Iterator zu bauen, ohne das man das ganze Interface implementieren muss. Erstellt man einen normalen Loop mit foreach muss man bei großen Datenmengen normalerweise auch gleich mit einer recht großen Menge an Arbeitsspeicher rechnen.
Einen Generator erstellt man mit einer Funktion, welche keine Werte mit dem Kommando return zurückgibt. Stattdessen liefert sie mit dem Schlüsselwort yield beliebig oft den aktuellen Wert der Iteration. Der benötigte Arbeitsspeicher liegt bei dieser Lösung ungefähr bei 1 kb.
8. Traits
Normalerweise kann eine Klasse genau eine Klasse erweitern und deren Eigenschaften erben. Seit PHP 5.4 kann man mit Traits eine Pseudo-Mehrfachvererbung erreichen, auch wenn sich der Mechanismus oft eher wie ein Mixin anfühlt, so kann man tatsächlich recht nützliche Dinge mit dem neuen Mechanismus implementieren.
Einer Klassendefinition kann damit beispielsweise schnell und problemlos ein Logger hinzugefügt werden. Eine Klasse kann auch mehrere Traits verwenden, die Namen der Methoden und auch deren Sichtbarkeit verändern.
9. Splat operator in PHP 5.6
Der Splat Operator (auch Scatter Operator) mit den 3 Punkten wird sowohl für das neue Feature Variadic Functions als auch für das Argument Unpacking verwendet. Notiert man bei einer Funktion bzw. Methode ein Argument mit 3 Punkten, kann eine unbestimmte Anzahl an Parametern übergeben. Mit dem Type Hinting kann man dabei auch die Typen festlegen.
Komplementär dazu kann man Funktionen, welche eine unbestimmte Anzahl von Argumenten akzeptieren, mit dem Operator die Parameter auch als Array übergeben und von der (nach einer Phase der Eingewöhnung) besseren Lesbarkeit profitieren.
10. Abstract und Interface method widening
Mit PHP 7.2 gibt es 2 interessante Neuigkeiten, die teilweise kontrovers gesehen werden. Abstrakte Klassen können – wenn sie von anderen abstrakten Klassen ableiten – den Typen von Argumenten weglassen. Das ändert jedoch nichts daran, dass der Interpreter einen bestimmten Typen erwartet. Den abstrakten Methoden kann auch ein Rückgabe-Typ hinzugefügt werden, wenn vorher keiner bestimmt wurde.
Bei Interfaces führt das Weglassen des Typs dazu, dass auch andere Typen an die Implementation der Methoden übergeben werden können. Das funktioniert aber nicht bei den Rückgabe-Typen, für den das Interface per Definition ja einstehen muss.
Die Qual der Wahl und der Rest
Ich glaube, dass meine persönliche Topliste der neuen PHP-Features ganz gut gelungen ist. Es fehlt natürlich noch eine ganz Reihe von interessanten Dingen, die hier unerwähnt bleiben mussten. Zudem gab es eine Unmenge an Funktionen, die neue dazu gekommen sind.
Ich bin aber überzeugt davon, dass man klar erkennen kann, dass sich PHP immer weiter in eine reife Sprache verwandelt (hat).
Ich habe die wichtigsten Features der Versionen im eingangs erwähnten Repository für jede Version zusammengefasst: New features 5.3, 5.4, 5.5, 5.6, 7.0, 7.1 und 7.2.
PHP 5.4 und PHP 5.5 haben am 23. März 2018 ihr Lebensende erreicht. Das selbe wird dann am Ende diesen Jahres auch für PHP 5.6 und PHP 7.0 gelten