PHP 8.6 doit sortir le 19 novembre 2026. La version présentée réunit des évolutions du langage, de nouvelles API, de meilleures capacités d'I/O et des valeurs par défaut plus sûres. Plusieurs anciennes interfaces et comportements ambigus passent aussi en phase de dépréciation.

L'application partielle permet de fixer certains arguments et de recevoir une closure pour les autres. Un point d'interrogation désigne un argument fourni plus tard. Trois points laissent ouverts les paramètres suivants. Avec l'opérateur pipe de PHP, cette possibilité réduit le besoin de closures intermédiaires dans les chaînes de transformation.

Les arguments utilisés lors de la création d'une fonction partielle sont évalués immédiatement. Une arrow function réévalue son expression à chaque appel, ce qui compte pour l'état, l'heure et les données de requête. L'application partielle ne fonctionne pas avec `new`, l'accès magique aux propriétés via `__get()` ou `__set()`, ni avec des fonctions liées au scope de l'appelant comme `extract()` et `func_get_arg()`. Le résultat est une closure anonyme. Le nom et les attributs de la fonction d'origine ne sont pas conservés comme avec un callable de première classe tel que `strlen(...)`.

Les propriétés readonly peuvent recevoir une valeur par défaut. L'attribut `#[\Override]` vérifie désormais aussi les constantes de classe et signale l'absence d'un membre correspondant dans la classe parente ou l'interface. Les enums peuvent implémenter `__debugInfo()` afin de contrôler leur affichage dans des fonctions comme `var_dump()`.

La nouvelle classe `\Time\Duration` représente explicitement les durées. Des méthodes comme `Duration::fromSeconds(5)` et `Duration::fromMilliseconds(500)` créent des valeurs dont l'unité est lisible dans le code. Une durée contient des secondes, des nanosecondes et un indicateur de signe. 1500 millisecondes correspondent ainsi à une seconde et 500 millions de nanosecondes.

Les durées peuvent être additionnées, multipliées et comparées directement. Elles sont immuables, donc chaque opération produit une nouvelle instance. Ce modèle convient aussi aux délais de nouvelle tentative et au backoff exponentiel.

PHP 8.6 ajoute `clamp()`, qui maintient une valeur entre une borne basse et une borne haute. La fonction accepte des nombres et des valeurs comparables comme les objets de date. Une date postérieure au 31 décembre 2026 peut ainsi être ramenée à cette date maximale.

Les erreurs de lecture du JSON indiquent désormais leur position. Les mécanismes existants comprennent `json_last_error()`, `json_last_error_msg()` et `JSON_THROW_ON_ERROR`, qui déclenche une `JsonException`. PHP 8.6 peut signaler un emplacement tel que `1:3` pour une erreur de syntaxe. Cette évolution concerne le diagnostic du parsing. Elle reste distincte du RFC sur la validation JSON Schema, qui traite la structure et le contenu attendus par une application.

Le nouvel enum standard `SortDirection` définit `Ascending` et `Descending`. Les bibliothèques peuvent l'utiliser pour typer les options de tri, convertir ses valeurs en `ASC` et `DESC` pour SQL, puis transformer un paramètre HTTP avant l'appel d'un repository.

La liste de caractères supprimés par défaut par `trim()`, `ltrim()` et `rtrim()` inclut désormais le caractère de saut de page `\f`. Les applications qui dépendent précisément de l'ancienne liste doivent vérifier leur traitement des chaînes lors du passage à PHP 8.6.

Le retour d'une valeur depuis `finally` devient obsolète. Cette construction peut remplacer la valeur renvoyée par `try` ou `catch`. Un `return;` sans valeur reste autorisé pour sortir rapidement. `spl_object_hash()` est également dépréciée, avec `spl_object_id()` comme API recommandée. Cette dernière renvoie un entier, alors que l'ancienne fonction produisait une chaîne de 32 caractères. Les valeurs renvoyées par `__construct()` et `__destruct()` sont aussi concernées.

La liste comprend encore `spl_classes()`, des alias de types anciens comme `is_double()`, `strcoll()` et `metaphone()`, la conversion d'objets en tableaux et certains noms utilisés pour des classes ou des fonctions. `let`, `is` et `readonly` sont réservés en vue d'une possible syntaxe future.

Les valeurs par défaut des sessions deviennent plus strictes. PHP 8.6 active `session.use_strict_mode = 1`, `session.cookie_httponly = 1` et `session.cookie_samesite = Lax`. Ces réglages limitent les identifiants de session fournis par un attaquant, empêchent JavaScript de lire directement le cookie de session et réduisent plusieurs risques liés aux requêtes intersites. Les flux d'authentification intersites et les applications qui lisent les cookies avec JavaScript doivent revoir leur configuration.

La nouvelle API de polling fournit une interface commune pour les mécanismes d'attente I/O propres aux systèmes. Elle peut sélectionner `epoll`, `kqueue`, event ports, `WSAPoll` ou `poll`. L'ancienne fonction `stream_select()` repose sur l'appel système `select()` et présente des limites de montée en charge et de portabilité.

L'API utilise `Io\Poll\Context`, `Io\Poll\Event` et `StreamPollHandle` pour surveiller des flux non bloquants. Un serveur TCP peut enregistrer un socket pour `Event::Read`, attendre avec `Context::wait()` et accepter un client lorsque l'événement se déclenche. Cette API fournit un mécanisme bas niveau. Elle ne constitue ni un modèle asynchrone complet ni une boucle d'événements. ReactPHP et Amp peuvent construire leurs abstractions de boucle au-dessus de cette couche.

`Context::wait()` accepte un délai `Time\Duration`. Une durée nulle vérifie les événements sans attendre. `null` attend indéfiniment. Les durées couvrent des intervalles allant des heures aux nanosecondes. L'exemple présenté utilise un délai de 1500 millisecondes.

La migration doit progresser par étapes: analyse, dry run, revue, application, tests, mesure, puis répétition. PHPCompatibility repère les incompatibilités et dépréciations dans du code que les tests n'exécutent pas. Rector automatise certaines réécritures, avec une vérification de son diff de dry run et de la couverture de son jeu de règles PHP. PHPStan, équipé de règles de dépréciation, détecte les API obsolètes lorsque ses stubs les connaissent. Une baseline permet de suivre l'arriéré existant. Les tests révèlent les avertissements d'exécution sur les chemins réellement exécutés. La CI peut bloquer toute hausse du nombre de dépréciations.

PHP 8.6 poursuit ainsi l'évolution vers des valeurs typées, des diagnostics plus précis, des sessions mieux protégées et une gestion native du polling I/O. Les dépréciations constituent le principal chantier de préparation.