PHP 8.2 – Lohnt sich das Update?

09.02.2023
extendedLogo

Am 08. Dezember 2022 ist mit PHP 8.2 die neue Minor-Version der Skriptsprache PHP erschienen. Welche Neuerungen und Veränderungen in PHP 8.2 enthalten sind, zeigen wir in diesem Blogbeitrag.

PHP 8.2, das neue PHP Minor-Release, beinhaltet bereits viele Änderungen und Features, die auf die nächste Major-Version vorbereiten. Auf den ersten Blick scheint PHP 8.2 keinen riesigen Schwung an Neuerungen mit sich zu bringen. Dennoch sind auch in diesem Release einige interessante Updates enthalten. In diesem Beitrag erfahren Sie, ob und unter welchen Voraussetzungen es sich für Shopbetreiber lohnt, PHP 8.2 zu installieren.

Neue Features und Verbesserungen

In gewohnter PHP-Manier liefert PHP 8.2 eine Menge neuer Funktionen und Verbesserungen. Neben einer besseren Performance wurden neue Features für Klassen, Typen und vieles mehr ausgerollt.

Performance

Die Performance von PHP 8.2 hat sich im Vergleich zum vorangegangenen Minor-Release PHP 8.1 wieder leicht verbessert. Das wird bereits anhand der Early-Benchmarks von Phoronix, die im Mai 2022 durchgeführt wurden, ersichtlich.

Early-Benchmarks PHP 8.2 von Phoronix (PHP Benchmark Suite)Early-Benchmarks von Phoronix (PHP Benchmark Suite) I Quelle: Phoronix

Readonly Classes

Seit PHP 8.1 können Klasseneigenschaften als schreibgeschützt gekennzeichnet werden, indem sie mit dem Keyword readonly versehen werden. In PHP 8.2 ist es nun möglich, ganze Klassen als readonly zu kennzeichnen. Das hat den Vorteil, dass alle in der Klasse enthaltenen Eigenschaften diese Kennzeichnung erben. Da Klasseneigenschaften nun nicht mehr einzeln mit readonly versehen werden müssen, spart das neue Feature viel Zeit.

readonly class Test {
    public string $prop;
}

Beispiel: Definition einer Klasse mit dem Keyword readonly | Quelle: php.net

Auch Klassen ohne Eigenschaften können als readonly gekennzeichnet werden. Auf diese Weise wird verhindert, dass der Klasse dynamische Eigenschaften hinzugefügt werden, während die Eigenschaften untergeordneter Klassen individuell als readonly deklariert werden können.

null und false als Standalone Types

Mit dem Major Update PHP 8.0 wurden die sogenannten Union Types eingeführt. Mithilfe dieser können Parameter und Variablen definiert werden, die mehrere mögliche Typen annehmen können. Auch false und null können in PHP 8.0 als Bestandteile von Union Types definiert werden, allerdings nicht als Standalone Types. Letzteres löst eine Fehlermeldung aus.

PHP 8.2 macht es nun möglich, false und null auch als Standalone Types zu definieren. Return-, Parameter- und Property-Types können auf diese Weise genau definiert werden.

class Nil {
    public null $nil = null;

    public function foo(null $v): null { /* ... */ *}
}

class Falsy {
    public false $nil = false;

    public function foo(false $v): false { /* ... */ *}
}

null und false als Standalone Types | Quelle: php.net

True Types

Mit der Einführung von PHP 8.2 wird auch der true Type etabliert. Dieser kann überall dort verwendet werden, wo PHP die Verwendung von Typen zulässt. So kann true genau wie false und null als Standalone Type oder als Teil von Union Types verwendet werden.

class Truthy {
    public true $truthy = true;

    public function foo(true $v): true { /* ... */ *}
}

Beispiel – true Type als Standalone Type | Quelle: php.net

Genau wie sein Gegenstück false erlaubt der true Type keinen Zwang. true und false können allerdings nicht gemeinsam mit dem PHP-Type bool in einem Union Type definiert werden. In diesem Fall würden Fehler bei der Kompilierung auftreten.

Konstanten in Traits

Aufs Wesentliche heruntergebrochen sind Traits Code, der innerhalb verschiedener Klassen wiederverwendet werden kann. Bisher konnten innerhalb der Traits nur Methoden und Eigenschaften definiert werden. Ab PHP 8.2 ist dies nun auch mit Konstanten möglich. Eine Definition von Trait-Konstanten gleicht der Definition von Konstanten innerhalb einer Klasse.

trait Foo {
    public const FLAG_1 = 1;
    protected const FLAG_2 = 2;
    private const FLAG_3 = 2;

    public function doFoo(int $flags): void {
        if ($flags & self::FLAG_1) {
            echo 'Got flag 1';
        }
        if ($flags & self::FLAG_2) {
            echo 'Got flag 2';
        }
        if ($flags & self::FLAG_3) {
            echo 'Got flag 3';
        }
    }
}

Beispiel einer Trait-Konstante | Quelle: php.net

Trait-Konstanten können über die jeweilige Klasse, in der der Trait mit der Konstante verwendet wird, aufgerufen werden. Ein Zugriff auf die Konstante über die definierten Eigenschaften ist jedoch nicht möglich.

Neue Zufall-Erweiterung

Mit der Random-Extension wird in PHP 8.2 ein neuer Zufallsgenerator implementiert, der deutlich leistungsfähiger und zuverlässiger als sein Vorgänger funktioniert. Die neue PHP-Klasse Randomizer kann eine solche Zufallsgenerator-Engine beinhalten. Bestehende PHP-Funktionen zur Erzeugung von Zufallszahlen werden in der neuen Extension organisiert und um neue PHP-Klassenstrukturen erweitert.

Disjunctive Normal Form Types

Die neu eingeführten DNF Types basieren auf der DNF-Methode, die zur Organisation von Booleschen Ausdrücken verwendet wird. DNF Types erlauben es, Intersection Types und Union Types miteinander zu kombinieren, damit sie vom Parser verarbeitet werden können. Bei einer solchen Kombination gilt standardmäßig, dass die Intersection Types mithilfe von Klammern gruppiert werden müssen.

interface A {}
interface B {}
interface C extends A {}
interface D {}

class W implements A {}
class X implements B {}
class Y implements A, B {}
class Z extends Y implements C {}

Beispiel eines DNF Types mit bereits existierenden Schnittstellen- und Klassendefinitionen | Quelle: php.net

Neue MySQLi-Erweiterung

Vor dem Release von PHP 8.2 war die Ausführung von parametrisierten SQL-Abfragen nur mithilfe einer Menge Boilerplate-Code möglich. Die neue MySQLi-Extension, die neben der neuen Funktion mysqli_execute_query auch die neue Methode mysqli::execute_query enthält, vereinfacht das Abrufen von Ergebnissen aus einer SQL-Abfrage erheblich.

Die Funktion mysqli_execute_query setzt sich aus den Funktionen mysqli_prepare(), mysqli_execute() und mysqli_stmt_get_result() zusammen. Auf diese Weise wird die MySQL-Abfrage vorbereitet, gebunden und innerhalb der Funktion ausgeführt. Verläuft die Abfrage erfolgreich, wird zudem ein mysqli_result-Objekt ausgegeben. Ist die Abfrage hingegen nicht erfolgreich, wird false ausgegeben.

Weitere Neuerungen

PHP 8.2 enthält neben den bereits genannten noch zahlreiche weitere Features. Dies sind einige davon:

  • Sensible Parameter in Backtraces: Stacktracing hilft beim Debuggen von Code und ist in PHP schon länger möglich. Sensible Parameter können in PHP 8.2 mit dem Attribut SensitiveParameter versehen werden. Dadurch werden sie aus dem Stacktrace entfernt.
  • Neue OpenSSL-Funktion: Die OpenSSL-Extension verfügt über die neue Funktion openssl_cipher_key_length. Diese gibt die erforderliche Länge des Keys für jede unterstützte OpenSSL-Chiffre zurück.
  • Upkeep-Funktion in Curl-Extension: Die neue Funktion curl_upkeep unterstützt dabei, eine Curl-Verbindung aufrechtzuerhalten. Diese Funktion wird aktuell nur von HTTP/2 unterstützt.

Verwerfungen

In PHP 8.2 werden bereits erste Vorbereitungen im Hinblick auf das nächste Major-Release PHP 9.0 getroffen. So gelten einige PHP-Funktionen und -Modalitäten mit Erscheinen von PHP 8.2 als veraltet und werden nicht weiter unterstützt.

Dynamische Klasseneigenschaften

Innerhalb von PHP-Klassen war es bislang möglich, nicht deklarierte Klasseneigenschaften dynamisch zu setzen. Diese Funktion bietet zwar die Flexibilität, Klassen ohne eine strikte Klassendefinition zu erstellen, allerdings besteht auch das Risiko auftretender Fehler innerhalb der Anwendung. In PHP 8.2 wird das Setzen eines Wertes für eine nicht deklarierte Klasseneigenschaft daher verworfen.

MySQLi-Kompilierung mit libmysqli

Bisher konnten MySQL-Datenbanken mit einer der beiden Libraries mysqlnd oder libmysqli kompiliert werden. Seit PHP 5.4 ist mysqlnd bereits standardmäßig als Library gesetzt. In PHP 8.2 und zukünftigen PHP-Versionen wird die MySQLi-Kompilierung mit libmysqli nicht länger unterstützt.

utf8_encode and utf8_decode

Die Funktionen utf8_encode und utf8_decode gelten in PHP 8.2 als veraltet. Bislang waren sie Teil der Standard-Library von PHP und dienten zur Konvertierung von Strings, die in ISO-8859-1 oder UTF-8 kodiert sind.

Sie können jedoch nicht verwendet werden, um andere gängige Strings zu konvertieren. Daher treten bei der Eingabe nicht unterstützter Strings häufig Fehler auf. Anstelle der genannten Funktionen wird die Verwendung der PHP-Extensions mbstring, intl oder iconv empfohlen.

Was ist vor dem Update zu beachten?

Sie denken über ein Update auf die neue PHP-Version 8.2 nach? Folgende Dinge sollten Sie prüfen, bevor Sie mit dem Update beginnen:

  1. Prüfen Sie, ob Ihr Shop- oder CMS-System bereits mit PHP 8.2 kompatibel ist.
  2. Erstellen Sie vor dem Update unbedingt ein Backup, um im Problemfall den ursprünglichen Zustand wiederherstellen zu können.
  3. Testen Sie das neue PHP-Update in einer Entwicklungsumgebung, um mögliche Problemszenarien schon im Vorfeld zu identifizieren. Diese Praxistests geben Ihnen mehr Sicherheit für das Update in Ihrer Produktivumgebung. Übrigens sollten auch Ihre eingesetzten Plugins auf Kompatibilität mit PHP 8.2 getestet werden.
  4. Anhand des PHP-Migrationsleitfadens können Sie feststellen, ob im Zuge des Updates Änderungen an Ihrem eigenen Code notwendig sind.
  5. Falls Ihre Tests erfolgreich waren, steht der Installation des Updates auch in Ihrer Produktivumgebung nichts mehr im Weg.

Erhöhen Sie die Sicherheit und Stabilität Ihrer Anwendung, indem Sie − sofern möglich − immer die aktuellste PHP-Version nutzen. Andernfalls verwenden Sie möglichst eine Version, die offizielle Security-Updates erhält. Je aktueller Ihre PHP-Version ist, desto höher ist in der Regel auch das Leistungspotenzial Ihrer Anwendung. Außerdem werden Sie weniger Probleme hinsichtlich der Nutzung von Features und Erweiterungen bei der Verwendung von Plugins haben.

Kompatibilität von PHP 8.2 mit gängigen Anwendungen

Die neuen Features und Verbesserungen von PHP 8.2 haben Sie überzeugt und Sie wollen Ihre Anwendung umgehend auf die neue Version umstellen? Da PHP 8.2 noch ziemlich neu ist, gibt es zum Teil noch keine Informationen in Bezug auf die Kompatibilität aller gängigen Anwendungen. Wir reichen Ihnen diese Informationen in diesem Blogartikel sukzessive nach, indem wir die nachfolgende Tabelle regelmäßig aktualisieren. Anhand der Tabelle können Sie überprüfen, ob die neue Version mit Ihrer Anwendung kompatibel ist:

Shopsystem / CMS Kompatibilität Anmerkung
Magento 1 Mit einer offiziellen Unterstützung ist nicht zu rechnen, da Magento 1 bereits End-of-Life ist
Magento 2 PHP 8.2 wird ab Version 2.4.6 unterstützt
Shopware 5 Eine Unterstützung von PHP 8.2 steht ab Version 5.7.17 zur Verfügung
Shopware 6 PHP 8.2 wird ab Version 6.5 unterstützt
TYPO3 Unterstützung von PHP 8.2 für Typo3 v12 und v11 LTS
WordPress / WooCommerce Unterstützung von PHP 8.2 ab WordPress 6.1
Drupal Unterstützung von PHP 8.2 ab Drupal 10.0.0
OroCommerce Unterstützung von PHP 8.2 ab Version 5.1 LTS von OroCommerce
Weitere Anwendungen Kompatibilität Anmerkung
Matomo (Piwik) Matomo ist mittlerweile mit PHP 8.2 kompatibel
Tideways Tideways ist bereits mit PHP 8.2 kompatibel

Welche Anwendungen und Shopsysteme sind kompatibel?

Hier finden Sie weitere Details zur (geplanten) Kompatibilität von PHP 8.2 mit gängigen Shop- und CMS-Systemen. Dieser Artikel wird fortlaufend aktualisiert, sodass fehlende Informationen nachgetragen werden, sobald diese bekannt sind.

Magento 2 und PHP 8.2

Magento 2 unterstützt PHP 8.2 ab der Version 2.4.6, die im März 2023 veröffentlicht wurde.

Magento 1 und PHP 8.2

Aufgrund des End-of-Life von Magento 1 ist davon auszugehen, dass es keine offizielle Unterstützung für PHP 8.2 geben wird. Im Rahmen des Magento-Forks "OpenMage Magento LTS" wird aktuell an einer Unterstützung für PHP 8.1 gearbeitet. Auch durch das Projekt “Mage One” sind möglicherweise demnächst entsprechende Patches verfügbar. Mehr dazu in unserer FAQ.

Shopware 6 und PHP 8.2

Seit dem Major-Release von Shopware 6.5, das im Mai 2023 erschienen ist, besteht Unterstützung für PHP 8.2.

Shopware 5 und PHP 8.2

Shopware 5 ist seit Version 5.7.17 mit PHP 8.2 kompatibel.

WordPress / WooCommerce und PHP 8.2

Für PHP 8.2 besteht bereits Support ab WordPress 6.1.

TYPO3 und PHP 8.2

Typo3 ist in den Versionen v12 und v11 LTS bereits mit PHP 8.2 kompatibel.

EOL und Roadmap aktueller PHP-Versionen

Ein sofortiger Wechsel auf PHP 8.2 ist natürlich nicht zwingend notwendig, dennoch sollten Sie die Roadmap der aktuellen PHP-Versionen im Auge behalten. So können Sie Ihre nächsten Schritte sorgfältig planen, ohne vom plötzlichen EOL einer PHP-Version überrascht zu werden. Einige Versionen erhalten noch inoffizielle Security-Backports, die auch auf unseren Clustern zur Verfügung stehen. Wir empfehlen jedoch den Einsatz einer möglichst aktuellen Version. Der offizielle Support für PHP 7.4 ist zum Beispiel vor kurzem ausgelaufen.

Version Security-Support
PHP 7.0 Inoffizielle Security Backports
PHP 7.1 Inoffizielle Security Backports
PHP 7.2 Inoffizielle Security Backports
PHP 7.3 Inoffizielle Security Backports
PHP 7.4 Inoffizielle Security Backports
PHP 8.0 Offizieller Security-Support bis 26.11.2023
PHP 8.1 Offizieller Security-Support bis 25.11.2024
PHP 8.2 Offizieller Security-Support bis 24.11.2025

Wechsel auf PHP 8.2: So gelingt das Update

Individuelle Einrichtung von PHP 8.2

Sollten Sie kein Managed Hosting verwenden, ist es möglich, PHP 8.2 auch individuell einzurichten. Dazu laden Sie zunächst die aktuelle Version herunter. Abhängig von Ihrem verwendeten Betriebssystem können Sie danach wie folgt vorgehen:

PHP 8.2 bei maxcluster einrichten

Bei maxcluster steht PHP 8.2 ab dem 01.02.2023 auf allen Ubuntu-Clustern zur Installation bereit. Wenn Sie die neue Version für Ihre Anwendung verwenden möchten, genügt es, wenn Sie die Version für den vHost in unserem Application Center aktivieren. Sollte die verwendete Anwendung in Kombination mit PHP 8.2 zu Problemen führen, kann der Vorgang umgehend rückgängig gemacht werden.

Installation von PHP 8.2 im Application Center von maxclusterInstallation von PHP 8.2 im Application Center von maxcluster I Screenshot: maxcluster

Sie nutzen noch einen unserer älteren Debian-Cluster und möchten gerne PHP 8.2 verwenden? Wenn Sie prüfen möchten, ob ein Wechsel auf einen Ubuntu-Cluster 18.04, 20.04 oder 22.04 möglich ist, wenden Sie sich jederzeit gerne an unseren Support. Unser Team unterstützt Sie gerne auch bei anderen Fragen und Problemen via E-Mail an support@maxcluster.de oder telefonisch unter 05251/41 41 30.

Fazit

PHP 8.2 enthält genau wie seine Vorgänger-Versionen viele nützliche Features und Verbesserungen. Auch die nächste Major-Version wirft bereits erste Schatten voraus. So sind einige etablierte PHP-Funktionen im Zuge des neuen Releases als veraltet deklariert worden. Planen Sie einen Wechsel auf die neue Version, prüfen Sie zuvor, ob Sie eine oder mehrere der veralteten PHP-Funktionen innerhalb Ihrer Anwendung verwenden.

Aktuell wird PHP 8.2 noch nicht von allen gängigen Shop- und CMS-Anwendungen unterstützt. Ein Wechsel ist erst ratsam, wenn der jeweilige Provider den offiziellen Support der neuen PHP-Version bekannt gibt.


Zuletzt aktualisiert am 29.03.2023 | DR