veilletech.fr
16 sept. Feed du jour
#04 PHP Article

PHP 8.6 : application partielle et clamp

Deux mois pour tester une version majeure, c'est déjà du temps emprunté.

PHP 8.6 est en bêta, avec gel des fonctionnalités le 22 septembre 2026 et sortie le 19 novembre. Au programme : l'application partielle de fonctions (RFC v2 adoptée 33 voix contre 0 après un refus en 2021), une fonction clamp(), une classe Time\Duration à la nanoseconde, les propriétés readonly avec valeur par défaut et des DocComments par paramètre. Trois réglages de session passent à des valeurs sûres pour les nouvelles installations.

3 min de lectureintermédiairevidéo 1:12
Partager
Sommaire6 sections
  1. Ce qui se passe
  2. Application partielle de fonctions
  3. Le confort quotidien
  4. Pour l'outillage bas niveau
  5. Ce qui peut casser
  6. À retenir

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.

PHP
$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

PHP
clamp(10,  min: 0, max: 100);   // 10
clamp(101, min: 0, max: 100);   // 100
clamp(-1,  min: 0, max: 100);   // 0

clamp() 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 :

PHP
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 fonctionnent

L'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 :

INI
session.use_strict_mode  = 1   ; était 0
session.cookie_httponly  = 1   ; était 0
session.cookie_samesite  = Lax ; n'était pas défini

Laravel 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.