PHP 8.6 befindet sich in der Beta-Phase. Die allgemeine Freigabe ist für den 19. November 2026 geplant. Alpha 1 bis Alpha 3 liefen vom 2. bis 30. Juli 2026. Beta 1 mit einem weichen Feature-Freeze erschien am 13. August, Beta 3 am 10. September. Der Feature-Freeze ist für den 22. September angesetzt, RC 1 für den 24. September und RC 4 für den 5. November. Daniel Scherzer, Matteo Beccati und Joe Ferguson betreuen die Veröffentlichung.

clamp.php
<?php
echo clamp(10, min: 0, max: 100), PHP_EOL;
echo clamp(101, min: 0, max: 100), PHP_EOL;
echo clamp(-1, min: 0, max: 100), PHP_EOL;

Die partielle Funktionsanwendung erzeugt aus einer Funktion mit bereits gesetzten Argumenten eine Closure. Das Zeichen `?` steht für ein später einzusetzendes einzelnes Argument, `...` für alle verbleibenden Argumente. Die Closure übernimmt Namen, Typen und Standardwerte der ursprünglichen Parameter. Bereits übergebene Werte werden beim Erzeugen der Closure ausgewertet. Ein Folge-RFC macht jeden `?`-Parameter in der Closure verpflichtend, auch wenn der ursprüngliche Parameter optional war. Ein erster Entwurf war 2021 abgelehnt worden. Die zweite Fassung erhielt 33 Ja-Stimmen und keine Gegenstimme.

`clamp()` begrenzt einen Wert auf ein Intervall und liefert bei einer Überschreitung die nächstgelegene Grenze. Die Funktion arbeitet mit vergleichbaren Typen, darunter Strings und `DateTime`-Objekte. Ein `$min` größer als `$max` löst `ValueError` aus. Damit gibt es eine eigene Funktion für das verbreitete Muster `min(max($value, $min), $max)`.

Mit `Time\Duration` kommt eine finale readonly-Klasse für Stoppuhr-Intervalle mit Nanosekundenauflösung. Sie stellt Fabrikmethoden für einzelne Einheiten, Rechenoperationen, Vergleiche und die Erzeugung aus ISO-8601-Dauern bereit. Kernfunktionen und die neue Polling-API können diesen gemeinsamen Typ verwenden, wo bisher lose Integer oder Float-Werte für Zeitspannen dienten.

Readonly properties dürfen nun Standardwerte besitzen. Vor PHP 8.6 führte eine solche Deklaration zu einem Compile-Fehler. Das erschwerte feste Implementierungen von Nur-Lese-Interface-Eigenschaften, die mit PHP 8.4 möglich wurden. Eine Klasse `CreateBooksTable implements Migration` kann nun etwa den Wert `2026_01_01_create_books_table` in `$name` hinterlegen. Die Regeln für readonly bleiben unverändert, eine erneute Zuweisung ist weiterhin ausgeschlossen.

Dokumentationskommentare können direkt an Funktionsparametern stehen. `ReflectionParameter::getDocComment()` liest sie aus. Dadurch lassen sich etwa `$query` und `$limit = 10` unmittelbar beschreiben, ohne den Parameternamen in einem darüberliegenden `@param`-Tag zu wiederholen. IDEs und statische Analysewerkzeuge können diese Angaben verwenden.

Die Namespace-Gruppe `Io\Poll` vereinheitlicht den Zugriff auf `epoll` unter Linux, `kqueue` unter BSD und macOS, Event Ports unter Solaris sowie `WSAPoll` unter Windows. Event-Loops und asynchrone Laufzeiten im Userland erhalten dafür `Context`, `Event` und `StreamPollHandle`. Die API ist für nicht blockierende Sockets ausgelegt und bildet eine Alternative zu `stream_select()`. Als wichtigste Motive nennt der RFC interne Signalverarbeitung und Verbesserungen an FPM. Asynchrone Frameworks sind eine weitere Zielgruppe.

Das globale Enum `SortDirection` enthält `Ascending` und `Descending`. PHP-Kernfunktionen verwenden es bisher nicht. Bibliotheken können damit einen gemeinsamen Typ anbieten, etwa für die Sortierrichtung in Query Buildern. Enums dürfen außerdem `__debugInfo()` implementieren. PHP 8.6 hebt die frühere Einschränkung auf, weil diese Methode keinen Objektzustand benötigt. `var_dump()` kann dadurch eine eigene Darstellung erhalten.

Für Streams entsteht ein einheitliches Fehlermodell. Die Context-Option `error_mode` wählt Warnungen, Exceptions oder Stille. `stream_last_errors()` liefert strukturierte `StreamError`-Objekte. Eine `StreamException` stellt die gesammelten Fehler bereit, deren Codes aus dem Enum `StreamErrorCode` stammen. Dieses Enum definiert mehr als 50 semantische Fehlercodes. Das gilt auch für den Versuch, `/nonexistent/file.txt` mit `StreamErrorMode::Exception` zu öffnen.

Die URI-Erweiterung aus PHP 8.5 erhält Builder-Klassen. Mit `Uri\Rfc3986\UriBuilder` lässt sich eine URI mit dem Schema `https`, dem Host `example.com` und dem Pfad `/foo/bar` über verkettete Setter zusammensetzen. Das Folge-RFC ergänzt `getUriType()`, `getHostType()` und Funktionen zur Prozentkodierung einzelner URI-Komponenten.

Bei neuen Installationen ändern sich drei native Session-Standards. `session.use_strict_mode` steigt von `0` auf `1`, `session.cookie_httponly` von `0` auf `1`, und `session.cookie_samesite` erhält statt eines nicht gesetzten Werts `Lax`. Laravel verwaltet seine Session-Cookies selbst, daher bleiben die meisten Laravel-Anwendungen unberührt. Anwendungen mit nativen PHP-Sessions sollten Abhängigkeiten von den bisherigen Werten prüfen. Die PHP-8.6-Vorbereitungsseite, der RFC-Index und die Liste der Deprecations führen die weiteren Release-Informationen auf.