PHP 8.6 est actuellement en bêta. La version générale doit paraître le 19 novembre 2026. Les trois versions alpha se sont succédé du 2 au 30 juillet 2026. La bêta 1, qui marquait un gel souple des fonctionnalités, est sortie le 13 août, puis la bêta 3 le 10 septembre. Le gel complet est prévu le 22 septembre, RC 1 le 24 septembre et RC 4 le 5 novembre. Daniel Scherzer, Matteo Beccati et Joe Ferguson sont les responsables de la version.

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;

L’application partielle de fonctions produit une closure après le remplissage d’une partie des arguments. Le marqueur `?` réserve un argument unique pour l’appel futur, tandis que `...` représente tous les arguments restants. La closure conserve les noms, les types et les valeurs par défaut de la fonction d’origine. Les arguments déjà fournis sont évalués lors de la création. Un RFC complémentaire impose chaque paramètre marqué par `?` dans la closure résultante, même lorsque le paramètre d’origine était facultatif. Une première proposition avait été rejetée en 2021. La version 2 a été adoptée par 33 voix contre 0.

La fonction `clamp()` maintient une valeur entre deux bornes et renvoie la borne la plus proche lorsqu’elle est dépassée. Elle accepte tous les types comparables, notamment les chaînes et les objets `DateTime`. Une valeur `$min` supérieure à `$max` déclenche `ValueError`. La fonction formalise le calcul courant `min(max($value, $min), $max)`.

La classe finale readonly `Time\Duration` représente une durée de type chronomètre avec une précision à la nanoseconde. Elle fournit des constructeurs pour chaque unité, des opérations arithmétiques, des comparaisons et une lecture des durées ISO 8601. Les fonctions du cœur et la nouvelle API de polling peuvent employer ce type commun, là où des entiers ou des flottants représentaient auparavant les durées.

Les propriétés readonly peuvent désormais recevoir une valeur par défaut. Avant PHP 8.6, le compilateur refusait cette écriture. La restriction compliquait les implémentations fixes de propriétés en lecture seule définies par des interfaces disponibles depuis PHP 8.4. Une classe `CreateBooksTable implements Migration` peut maintenant initialiser `$name` avec `2026_01_01_create_books_table`. Les règles readonly ne changent pas et une propriété ne peut toujours pas être réassignée.

Les commentaires de documentation peuvent être placés directement sur les paramètres. `ReflectionParameter::getDocComment()` les expose aux outils. Une description de `$query` ou de `$limit = 10` peut donc accompagner le paramètre sans répéter son nom dans une balise `@param` située au-dessus de la fonction. Les IDE et les analyseurs statiques peuvent exploiter ces commentaires.

Le namespace `Io\Poll` propose une interface commune aux mécanismes `epoll` de Linux, `kqueue` de BSD et macOS, event ports de Solaris et `WSAPoll` de Windows. Les boucles événementielles et les runtimes asynchrones en espace utilisateur peuvent utiliser `Context`, `Event` et `StreamPollHandle` avec des sockets non bloquants. Cette API prend la place de `stream_select()` pour ces usages. Le RFC vise d’abord la gestion interne des signaux et des améliorations de FPM. Les frameworks asynchrones constituent une seconde cible.

L’enum globale `SortDirection` fournit les cas `Ascending` et `Descending`. Le cœur de PHP ne l’accepte pas encore. Les bibliothèques peuvent néanmoins partager ce type, notamment dans les query builders. Les enums peuvent aussi définir `__debugInfo()`. PHP 8.6 l’autorise parce que cette méthode n’a pas besoin d’état, ce qui permet de personnaliser l’affichage de `var_dump()`.

Les flux adoptent un modèle d’erreur unifié. L’option de contexte `error_mode` sélectionne les avertissements, les exceptions ou le silence. `stream_last_errors()` renvoie des objets structurés `StreamError`. `StreamException` expose les erreurs collectées et leurs codes issus de l’enum `StreamErrorCode`, qui en contient plus de 50. Le modèle couvre notamment l’ouverture de `/nonexistent/file.txt` avec `StreamErrorMode::Exception`.

L’extension URI introduite dans PHP 8.5 reçoit des builders. `Uri\Rfc3986\UriBuilder` peut construire une URI avec le schéma `https`, l’hôte `example.com` et le chemin `/foo/bar` au moyen de setters chaînés. Le RFC de suivi ajoute `getUriType()`, `getHostType()` et des fonctions de pourcentage-encodage pour chaque composant URI.

Les nouvelles installations adoptent trois valeurs par défaut de session plus strictes. `session.use_strict_mode` passe de `0` à `1`, `session.cookie_httponly` de `0` à `1`, et `session.cookie_samesite` prend `Lax` au lieu d’une valeur absente. Laravel gère ses propres cookies de session, ce qui limite l’impact sur la plupart des applications Laravel. Les applications qui utilisent les sessions natives de PHP doivent vérifier leur dépendance aux anciennes valeurs. La page de préparation de PHP 8.6, l’index des RFC et la liste des dépréciations recensent les autres éléments de la version.