Ce qui se passe
PHP 8.6 sort le 19 novembre 2026. La version est en bêta, et le calendrier de la page de préparation fixe le gel des fonctionnalités au 22 septembre, la RC1 au 24 septembre et la RC4 au 5 novembre. Les release managers sont Daniel Scherzer, Matteo Beccati et Joe Ferguson.
Application partielle de fonctions
Le morceau de choix. On appelle une fonction en laissant un ? à la place d'un
argument, et on récupère une closure qui attend le reste. ... tient lieu de
tous les arguments restants.
$makeSlug = str_replace(' ', '-', ?);
$makeSlug('Hello World'); // Hello-World
$titles = array_map(strtolower(?), $titles);La closure conserve les noms, types et valeurs par défaut de la fonction
d'origine. Les arguments fournis sont évalués à la création de la partielle,
pas à son appel. Une RFC de suivi
a tranché un point : chaque ? devient un paramètre obligatoire de la
closure, même si le paramètre d'origine était optionnel.
Une première version de la proposition avait été rejetée en 2021 ; la v2 est passée 33 voix contre 0.
Le confort quotidien
clamp(10, min: 0, max: 100); // 10
clamp(101, min: 0, max: 100); // 100
clamp(-1, min: 0, max: 100); // 0clamp() accepte tout type comparable, y compris les chaînes et les DateTime,
et lève une ValueError si $min > $max. Elle remplace le
min(max($v, $min), $max) qu'on écrit à l'envers une fois sur deux.
Time\Duration est une classe final readonly qui représente une durée à la
nanoseconde, avec des fabriques par unité, de l'arithmétique et des comparaisons :
use Time\Duration;
$delay = Duration::fromMilliseconds(100)->multiplyBy(2 ** $attempt);
$total = Duration::fromSeconds(1)->add(Duration::fromMilliseconds(500));
$total > $delay; // les opérateurs de comparaison fonctionnentL'intention est d'offrir un type partagé que les fonctions du cœur et la nouvelle API d'attente accepteront à la place d'entiers ou de flottants nus.
Trois autres retouches : les propriétés readonly acceptent enfin une valeur par
défaut (la sémantique ne change pas, la propriété reste non réassignable) ; les
DocComments peuvent se poser directement sur un paramètre, et
ReflectionParameter::getDocComment() les rend ; les enums peuvent implémenter
__debugInfo().
Pour l'outillage bas niveau
Le namespace Io\Poll donne une interface unifiée aux mécanismes d'attente de
la plateforme — epoll sur Linux, kqueue sur BSD et macOS, event ports sur
Solaris, WSAPoll sur Windows — en remplacement de stream_select(). La RFC
annonce une motivation d'abord interne (gestion des signaux, améliorations de
FPM), les frameworks async userland venant en second.
Viennent aussi une enum globale SortDirection (que rien dans le cœur
n'accepte encore), des classes builder pour l'extension URI arrivée en
PHP 8.5, et un modèle d'erreur unifié pour les flux : une option de contexte
error_mode, une fonction stream_last_errors(), et plus de 50 codes sémantiques
dans une enum StreamErrorCode.
Ce qui peut casser
Trois valeurs par défaut de session changent, pour les nouvelles installations seulement :
session.use_strict_mode = 1 ; était 0
session.cookie_httponly = 1 ; était 0
session.cookie_samesite = Lax ; n'était pas définiLaravel gère ses propres cookies de session : la plupart des applications ne verront rien. Celles qui s'appuient sur les sessions natives de PHP et sur les anciens défauts doivent vérifier ce qu'elles supposent.
À retenir
Rien dans cette version n'oblige à réécrire du code, mais l'application
partielle et Time\Duration vont changer la façon d'écrire des callbacks et de
manipuler des durées. Le gel des fonctionnalités tombe le 22 septembre : c'est
maintenant que tester la bêta a encore une chance d'influer sur le résultat.