PHP 8.0 erschien im November 2020 und war der größte Versionssprung seit 7.0: Union Types, Named Arguments, Attribute, match, der JIT-Compiler, und vor allem die strengeren Typ-Vergleiche, die so viele 7.x-Anwendungen zum Stolpern brachten. Seit dem 26. November 2023 gibt es keine Sicherheitsupdates mehr; das letzte Release war 8.0.30.
Wo PHP 8.0 heute steht
Drei Jahre ohne Pflege. Die beiden kritischen Lücken vom 21. Oktober 2026 wurden für 8.0 nicht geschlossen; der offizielle Fix gab es nur ab 8.2. Hoster haben 8.0 vielfach aus dem Angebot genommen oder stellen automatisch auf 8.1 oder 8.2 um, was mit altem Code eigene Überraschungen bringt.
Die typische 8.0-Anwendung hat 2021 oder 2022 eine aufwändige Migration hinter sich gebracht und ist dann stehengeblieben. Frameworks dieser Zeit: Laravel 8 und 9, Symfony 5.4, TYPO3 11, Shopware 6.4. Mehrere davon unterstützen 8.4 nicht, und das ist meist der eigentliche Grund, warum das Upgrade liegt.
Was beim Upgrade von 8.0 auf PHP 8.4 bricht
Die Typ-Umstellung ist geschafft; es bleiben die Änderungen von 8.1 bis 8.4:
- mysqli wirft Ausnahmen seit 8.1 (Standard ist jetzt der strikte Fehlermodus). Code, der auf
falseprüft, bekommt unbehandelte Ausnahmen. PDO verhält sich seit 8.0 schon so. - null an interne Funktionen mit nicht nullbaren Parametern ist seit 8.1 veraltet.
trim(null),strlen(null),str_replace()mitnull-Betreff. In Formular-Code häufig, mechanisch zu beheben. - Serializable ohne __serialize/__unserialize ist seit 8.1 veraltet; betrifft Session- und Cache-Klassen.
- strftime(), gmstrftime(), date_sunrise() und FILTER_SANITIZE_STRING sind seit 8.1 veraltet.
- Dynamische Eigenschaften sind seit 8.2 veraltet: Werte, die an
$this->irgendwasgehängt werden, ohne deklariert zu sein. In alten Modellklassen und Plugins häufig; der Ausweg ist eine Deklaration oder#[\AllowDynamicProperties]. ${var}-Interpolation in Zeichenketten und utf8_encode/utf8_decode sind seit 8.2 veraltet.- strtolower/strtoupper sind seit 8.2 nicht mehr von der Locale abhängig. Code, der auf
setlocale()für Umlaute setzte, verhält sich anders. - get_class() ohne Argument ist seit 8.3 veraltet; unserialize() meldet Fehler lauter.
- Implizit nullbare Parameter (
Type $x = nullstatt?Type $x = null) sind seit 8.4 veraltet, E_STRICT ist entfernt, round() rundet in Grenzfällen anders.
Was sich zwischen 8.0, 8.1, 8.2 und 8.3 jeweils geändert hat und was 8.4 Neues bringt, steht in eigenen Beiträgen.
Der Weg von 8.0 auf PHP 8.4
- Kurz-Check oder Befund:
composer installunter 8.4 zeigt den Blocker in Minuten. Wenn keiner da ist, reicht oft der Kurz-Check, um den Aufwand einzuordnen. - Framework zuerst, falls es 8.4 nicht unterstützt: Symfony 4 auf 6, Laravel in Etappen.
- Deprecations beheben, mit Rector automatisiert, Rest von Hand.
- Testsuite unter 8.4, dann umschalten mit Rückweg.
Häufig Tage, nicht Wochen. Die Ausnahme ist ein Framework-Upgrade über mehrere Hauptversionen.
Für wen das nicht passt
Eine Anwendung, deren Framework keinen Pfad zu 8.4 hat, steht vor der Framework-Frage, nicht vor der PHP-Frage. Das sortieren wir im Befund.