PHP 8.6 : l’essentiel des nouveautés
Publié le 4 novembre 2026
PHP 8.6 sort le 19 novembre 2026. Trois nouveautés se détachent : une API de polling native, un type dédié aux durées et l’application partielle de fonctions, ainsi que quelques nouveautés que nous allons décortiquer ensemble dans cet article.

Une API de polling comme feature la plus attendue de cette version
Jusqu’ici, pour surveiller plusieurs flux à la fois, PHP ne proposait que stream_select(). Cette fonction repose sur l’appel système select(), dont le coût augmente avec le nombre de connexions surveillées. Pour un serveur WebSocket ou un worker qui garde beaucoup de sockets ouvertes, la limite arrive vite.
Le nouvel espace de noms Io\Poll donne accès aux mécanismes que les systèmes d’exploitation proposent pour ce travail : epoll sous Linux, kqueue sous BSD et macOS, event ports sous Solaris, WSAPoll sous Windows. PHP choisit automatiquement le bon selon la plateforme.
<?php
use Io\Poll\{Context, Event, StreamPollHandle};
use Time\Duration;
$context = new Context(); // choix automatique du backend
$server = stream_socket_server('tcp://0.0.0.0:8080');
stream_set_blocking($server, false);
$context->add(new StreamPollHandle($server), [Event::Read], ['type' => 'server']);
while (true) {
$watchers = $context->wait(Duration::fromSeconds(1));
// ...
}
Cette API n’ajoute pas d’asynchrone à PHP : pas de boucle d’événements ni de mot-clé async. C’est une brique de base. Les bibliothèques comme ReactPHP, Amp ou Revolt, qui devaient jusqu’ici passer par des extensions PECL pour obtenir ces performances, pourront s’appuyer sur le cœur du langage. La RFC cite aussi des usages internes, comme la gestion des signaux en mode ZTS et des améliorations de PHP-FPM.
Time\Duration: une API unifiée pour gérer les durées et le temps
sleep(2), usleep(2000000), un timeout en secondes flottantes, un autre en millisecondes : en PHP, une durée a toujours été un nombre dont il fallait deviner l’unité. PHP 8.6 ajoute Time\Duration, une classe finale en lecture seule, précise à la nanoseconde.
<?php
use Time\Duration;
$attempt = 5;
$delay = Duration::fromMilliseconds(100)->multiplyBy(2 ** $attempt);
if ($delay > Duration::fromSeconds(2)) {
// ...
}
On crée une durée à partir de l’unité de son choix ou d’une chaîne ISO 8601, on l’additionne, on la multiplie et on la compare directement avec < ou >. L’idée est d’en faire le type commun des durées dans le cœur du langage.
Les PFA arrivent et complètent le pipe operator
L’application partielle de fonctions consiste à appeler une fonction avec une partie de ses arguments pour récupérer une closure qui attend le reste. Le marqueur ? remplace un argument, ... remplace tous ceux qui restent.
<?php
$makeSlug = str_replace(' ', '-', ?);
echo $makeSlug('Hello World'); // Hello-World
Elle devient vraiment utile avec l’opérateur pipe |> arrivé en PHP 8.5, qui attend un callable à un seul paramètre. Plus besoin d’écrire une fonction fléchée à chaque étape :
<?php
$slug = 'Hello World'
|> str_replace(' ', '-', ?)
|> strtolower(...);
// hello-world
Attention, les arguments déjà fournis sont évalués à la création de la closure, pas à son appel. Refusée en 2021 dans une première version, la proposition a cette fois été adoptée à l’unanimité.
Les autres nouveautés
- La fonction clamp() borne une valeur entre un minimum et un maximum, à la place de
min(max($value, $min), $max). - Une propriété
readonlypeut désormais avoir une valeur par défaut, ce qui simplifie l’implémentation des interfaces à property hooks de PHP 8.4. - Les DocComments peuvent se placer directement sur un paramètre et se lisent avec
ReflectionParameter::getDocComment(). - Les enums peuvent implémenter __debugInfo() pour personnaliser la sortie de
var_dump(). - Les flux ont un modèle d’erreurs unifié : avec l’option
error_mode, unfopen()raté peut lever une exception plutôt qu’un avertissement. - L’extension URI de PHP 8.5 reçoit des classes builder pour assembler une URI pas à pas.
- Une enum SortDirection
(Ascending, Descending)fournit un type commun aux ORM et aux query builders. ReflectionPropertygagneisReadable()etisWriteable()pour savoir si une propriété est accessible depuis un scope donné.
Sécurité : des sessions protégées par défaut
PHP 8.6 change trois valeurs par défaut du php.ini. session.use_strict_mode et session.cookie_httponly passent à 1, et session.cookie_samesite vaut désormais Lax. Le premier bloque les attaques par fixation de session, le deuxième empêche le JavaScript de lire le cookie de session, le troisième empêche son envoi sur les requêtes POST venues d’un autre site.
En pratique, peu d’équipes verront la différence : Symfony et Laravel configurent déjà eux-mêmes leurs cookies de session. Seules les applications qui utilisent les sessions natives de PHP sont concernées.
Le changement compte surtout pour ce qu’il annonce. Pendant des années, des réglages recommandés par la documentation de PHP elle-même sont restés désactivés par défaut pour ne rien casser. Avec cette RFC, PHP accepte de faire de la configuration la plus sûre le point de départ, et laisse le soin de l’assouplir à ceux qui en ont besoin. On peut espérer que d’autres directives suivent le même chemin dans les prochaines versions, à commencer par expose_php, toujours activée par défaut.
Passer à PHP 8.6 avec Les-Tilleuls.coop
PHP 8.6 est une version mineure : un projet à jour sur PHP 8.4 ou 8.5 migrera sans réécriture. Attention en revanche à PHP 8.2, qui ne recevra plus aucun correctif de sécurité après le 31 décembre 2026. Nos équipes mènent régulièrement ces montées de version, de l’audit à la mise en production, sur Symfony comme sur des projets PHP sur mesure. Nous proposons aussi des formations pour prendre en main les nouveautés du langage, en compagnie de mainteneurs et contributeurs directs à PHP. Écrivez-nous !