PHP 8.5 est sorti le 20 novembre 2025. L’article le présente comme la version à viser près d’un an plus tard. Laravel 12 et 13 prennent en charge PHP 8.3 à 8.5, les plateformes d’hébergement proposent PHP 8.5, et la prochaine version de PHP est attendue en novembre. L’auteur considère l’opérateur pipe comme le changement syntaxique majeur de cette version.

slug-pipeline.php
$title = ' PHP 8.5 Released ';
$slug = $title
 |> trim(...)
 |> (fn($str) => str_replace(' ', '-', $str))
 |> (fn($str) => str_replace('.', '', $str))
 |> strtolower(...);

L’opérateur pipe transmet la valeur située à gauche au callable situé à droite. Une chaîne suit ainsi l’ordre réel d’exécution, de haut en bas. Chaque étape doit accepter un argument. La syntaxe des callables de première classe, comme trim(...), convient aux fonctions à un argument, et les autres cas utilisent une fonction fléchée entre parenthèses. Les pipes fonctionnent avec les fonctions PHP ordinaires et ne nécessitent aucun objet de collection ou wrapper. L’exemple transforme " PHP 8.5 Released " en slug "php-85-released".

PHP 8.5 intègre une extension URI. Elle suit les standards RFC 3986 et WHATWG et renvoie un objet. Elle fournit ainsi une solution conforme aux standards face au résultat sous forme de tableau de parse_url(). Uri\Rfc3986\Uri peut analyser https://php.net/releases/8.5/en.php, puis getHost() renvoie "php.net".

Une copie modifiée d’un objet readonly se crée avec clone($this, ['alpha' => $alpha]). L’attribut #[\NoDiscard] avertit lorsqu’un appel ignore une valeur de retour qui doit être vérifiée. Un cast explicite en (void) signale que l’abandon est volontaire. array_first() et array_last() donnent directement la première et la dernière valeur d’un tableau. Les deux fonctions renvoient null pour un tableau vide.

Les closures statiques et les callables de première classe peuvent désormais figurer dans les expressions constantes, y compris dans les arguments d’attributs. Les règles peuvent ainsi être écrites sous forme de code vérifié par le système de types, avec moins de logique stockée dans des chaînes. La version ajoute aussi une trace d’appel aux erreurs fatales, curl_share_init_persistent() pour réutiliser les données DNS et les connexions entre les requêtes, #[\Override] sur les propriétés, final dans la promotion des constructeurs, ainsi que get_error_handler() et get_exception_handler() pour inspecter les gestionnaires actifs.

L’opérateur backtick d’exécution de commandes shell est déprécié, avec shell_exec('ls') comme solution. Les noms de cast (boolean), (integer), (double) et (binary) cèdent la place à (bool), (int), (float) et (string). Une clé de tableau null doit devenir une clé explicite ''. Un case de switch terminé par un point-virgule doit utiliser deux-points. __sleep() et __wakeup() passent en soft-deprecated, au profit de __serialize() et __unserialize(). Le réglage INI disable_classes a été supprimé sans remplacement.

PHP 8.5 émet aussi des avertissements lors d’un cast de NAN, de la déstructuration d’une valeur qui n’est pas un tableau et de la conversion d’un float trop grand pour un int. Les suites de tests doivent être exécutées avec les dépréciations visibles avant le déploiement. Pour Laravel, l’article conseille les pipes dans les helpers PHP, les actions et les data mappers, clone pour les DTO et value objects, puis #[\NoDiscard] sur les méthodes comme save() lorsque false indique un échec.