In elf Tagen soll PHP 8.6 erscheinen: Das PHP-Projekt plant die finale Version für den 19. November 2026. Seit dem 5. November steht der Release Candidate RC5 zum Testen bereit, ausdrücklich nicht für den Produktivbetrieb[1]. Ein aktueller Exakat-Beitrag und die anschließende Diskussion auf Reddit greifen eine unscheinbare Neuerung auf[5][8]: Der Compiler übersetzt bestimmte Aufrufe von printf und array_map in einfacheren Code. Wir zeigen, was diese PHP-8.6-Optimierungen bringen, welcher Fehler dabei noch offen ist und wie Sie Ihre Website oder Anwendung sicher auf das Update vorbereiten.

Der Compiler ist der Teil von PHP, der Ihren Quellcode vor der Ausführung in interne Befehle übersetzt. In PHP 8.6 erkennt er zwei Muster und ersetzt sie durch gleichwertigen, schnelleren Code[2]:
Die Umschreibung greift nicht überall. Beim printf-Pfad prüft der Compiler unter anderem, ob der Formatstring zur Übersetzungszeit feststeht, kürzer als 256 Bytes ist und die Zahl der Argumente passt[3]. Die array_map-Umschreibung gilt nur für genau ein Eingabe-Array und ist bei aktiviertem strict_types=1 abgeschaltet. Bei Partial Function Applications müssen vorbelegte Argumente direkt angegebene Werte sein, sogenannte Literale. Die Funktion array_map selbst funktioniert dann natürlich weiter wie gewohnt[3].
Kurz zu den Begriffen: array_map wendet eine Funktion auf jedes Element einer Liste an, etwa um alle Bruttopreise in Nettopreise umzurechnen. Ein First-Class-Callable ist die Schreibweise funktion(...), mit der sich eine Funktion seit PHP 8.1 wie ein Wert übergeben lässt. Genau diese moderne Schreibweise belohnt PHP 8.6 jetzt mit schnellerem Code.
<?php
// Kandidat für die Optimierung (ohne strict_types=1, genau ein Array):
$nettoPreise = array_map(netto(...), $bruttoPreise);
// PHP 8.6 übersetzt das sinngemäß in:
$nettoPreise = [];
foreach ($bruttoPreise as $schluessel => $preis) {
$nettoPreise[$schluessel] = netto($preis);
}Ausgelöst hat die aktuelle Diskussion ein Beitrag des PHP-Analysespezialisten Exakat vom 7. November[5], der am 8. November auf Reddit in r/PHP geteilt wurde[8]. Exakat verglich in lokalen Mikrobenchmarks PHP 8.5.12 mit einem Entwicklungsstand von PHP 8.6. Die Callback-Tests umfassten je Messlauf 300 Durchläufe mit jeweils 1.000 Elementen, die Stringtests jeweils eine Million Aufrufe[5]:
Beim array_map-Fall halbiert sich die Laufzeit also ungefähr. Beim sprintf-Test war der Entwicklungsstand dagegen deutlich langsamer; Exakat vermutet eine Regression, also eine unbeabsichtigte Leistungsverschlechterung des getesteten Entwicklungsstands; diese Erklärung ist nicht unabhängig bestätigt[5]. Exakat warnt selbst davor, absolute Werte auf eigene Anwendungen zu übertragen. In der Reddit-Diskussion wird zudem hinterfragt, welcher Version die String-Optimierung zuzuordnen ist und wie die Zahlen zu deuten sind[8]. Die Entwickler der array_map-Optimierung hatten im ursprünglichen Patch 172,2 gegenüber 155,1 ms mit OPcache (einem Zwischenspeicher für übersetzten Code) und 166,9 gegenüber 94,5 ms mit Tracing-JIT (Übersetzung in Maschinencode zur Laufzeit) gemessen[6].
Namespaces funktionieren wie Ordner für Funktionen und Klassen, damit sich gleichnamige Funktionen nicht in die Quere kommen. Mit use function holt man eine Funktion aus einem solchen Ordner in den aktuellen Code. Gerade moderne Projekte organisieren eigene Hilfsfunktionen gern so. Wer PHP 8.6 jetzt testet, sollte genau solche Stellen gezielt prüfen. Wichtig: Innerhalb eines Namespace muss der Compiler array_map eindeutig als globale Funktion erkennen, etwa durch \array_map(...) oder durch use function array_map;. Ohne Qualifizierung oder Import greift die Umschreibung dort nicht[3]. Die Regressionstests des Korrekturvorschlags verwenden \array_map[7]:
<?php
namespace App\Shop;
use function App\Helpers\netto;
$bruttoPreise = [119.0, 238.0];
// Gezielt testen: Wird unter PHP 8.6 RC wirklich App\Helpers\netto() aufgerufen?
$nettoPreise = \array_map(netto(...), $bruttoPreise);
// Erwartet, wenn netto() durch 1,19 teilt: [100.0, 200.0]
var_dump($nettoPreise);Die finale Version ist für den 19. November 2026 geplant. Seit dem 5. November steht RC5 zum Testen bereit, nicht für den Produktivbetrieb.
Nicht automatisch. Die neuen Optimierungen greifen nur bei bestimmten printf- und array_map-Aufrufen. Wie stark Ihre Anwendung profitiert, zeigt nur ein Vergleich mit Ihren eigenen Seiten.
Mit declare(strict_types=1) prüft PHP Datentypen strenger. Weil array_map Callbacks intern anders aufruft, ist die neue Umschreibung in solchen Dateien abgeschaltet. array_map funktioniert dort wie bisher.
Laut Fehlerbericht nein. Genannt werden PHP 8.6 RC3 bis RC5 und der aktuelle Entwicklungszweig. Ob der Fix bis zum finalen Release eingearbeitet ist, war am 8. November offen.
Erst wenn Ihre Abhängigkeiten PHP 8.6 unterstützen und Ihre Tests auf der finalen Version erfolgreich waren. Bis dahin ist eine Testumgebung der richtige Ort für PHP 8.6.
- PHP.net: News-Archiv 2026, PHP 8.6.0 RC5 available for testing (05.11.2026): php.net
- php-src: UPGRADING am Tag php-8.6.0RC5, Abschnitt Performance: github.com/php/php-src
- php-src: Zend/zend_compile.c am Tag php-8.6.0RC5: github.com/php/php-src
- PHP-Handbuch: Migration auf PHP 8.4, sonstige Änderungen: php.net
- Exakat: PHP 8.6 rewrites some of your calls before you notice (07.11.2026): exakat.io
- php-src: Pull Request #20934, array_map-Optimierung: github.com
- php-src: Pull Request #25286, Funktionsauflösung bei der array_map-Umschreibung (07.11.2026): github.com
- Reddit r/PHP: Diskussion zum Exakat-Beitrag (08.11.2026): reddit.com