PHP 8.5 est sorti le 20 novembre 2025, un an après PHP 8.4 et ses property hooks. La nouveauté la plus visible est l'opérateur pipe (|>), qui permet d'enchaîner des traitements de gauche à droite, comme dans un terminal Unix. Mais cette version apporte aussi une extension pour manipuler les URL, une syntaxe plus simple pour cloner des objets immuables et plusieurs petites fonctions très attendues. Tour d'horizon, avec des exemples.
L'opérateur pipe : lire le code dans l'ordre
Transformer une valeur en plusieurs étapes donnait jusqu'ici soit des appels imbriqués, à lire de l'intérieur vers l'extérieur, soit une série de variables intermédiaires :
// Appels imbriqués : on lit à l'envers
$slug = strtolower(str_replace(' ', '-', trim($title)));
Avec l'opérateur pipe, la valeur de gauche est passée en argument à la fonction de droite, et les étapes se lisent dans l'ordre où elles s'exécutent :
$slug = $title
|> trim(...)
|> (fn (string $value) => str_replace(' ', '-', $value))
|> strtolower(...);
La syntaxe trim(...) désigne la fonction elle-même (on parle de first-class callable), sans l'appeler. Chaque étape doit être un « callable » qui accepte un seul paramètre obligatoire ; quand une fonction en attend plusieurs, comme str_replace(), on l'enveloppe dans une fonction fléchée. Attention aux parenthèses autour des fonctions fléchées : elles sont obligatoires dans une chaîne de pipes.
L'opérateur pipe n'apporte rien de nouveau en termes de possibilités, mais il améliore nettement la lisibilité des traitements de données : nettoyage d'une saisie, préparation d'un export, chaîne de filtres sur un tableau.
clone with : modifier un objet immuable en une ligne
Les classes readonly sont très pratiques pour les objets de valeur (une adresse, un montant, une plage de dates), mais créer une copie modifiée était fastidieux. PHP 8.5 permet de passer à clone() un tableau de propriétés à modifier :
final readonly class Money
{
public function __construct(
public int $amount,
public string $currency,
) {}
public function withAmount(int $amount): self
{
return clone($this, ['amount' => $amount]);
}
}
Plus besoin de reconstruire l'objet en recopiant chaque propriété : le motif des méthodes with…() devient trivial.
Une extension native pour les URL
Analyser une URL avec parse_url() comporte de nombreux pièges : la fonction ne suit aucun standard précis et accepte des adresses invalides. PHP 8.5 intègre une extension URI qui suit deux standards au choix, la RFC 3986 et le standard WHATWG URL utilisé par les navigateurs :
use Uri\Rfc3986\Uri;
$uri = new Uri('https://exemple.fr/blog?page=2');
echo $uri->getHost(); // exemple.fr
echo $uri->withPath('/contact')->toString(); // https://exemple.fr/contact?page=2
Les objets sont immuables, et les adresses invalides sont rejetées. Pour une application qui valide des URL saisies par les utilisateurs, construit des liens de redirection ou interroge des API, c'est une vraie amélioration de la sécurité. Voir aussi mon article sur les redirections 301, où la manipulation d'URL tient une grande place.
L'attribut #[\NoDiscard]
Certaines fonctions retournent une valeur qu'il serait dangereux d'ignorer, par exemple le résultat d'une opération qui peut échouer. L'attribut #[\NoDiscard] fait émettre un avertissement si la valeur de retour n'est pas utilisée :
#[\NoDiscard('Le résultat indique si la sauvegarde a réussi')]
function saveInvoice(Invoice $invoice): bool
{
// ...
}
saveInvoice($invoice); // Warning : valeur de retour ignorée
(void) saveInvoice($invoice); // Ignoré volontairement : pas d'avertissement
array_first() et array_last()
Enfin des fonctions simples pour obtenir le premier ou le dernier élément d'un tableau, sans manipuler son pointeur interne avec reset() ou end() :
$latestOrder = array_last($orders); // null si le tableau est vide
$firstOrder = array_first($orders);
Elles complètent array_find() et array_any(), arrivées avec PHP 8.4.
Les autres nouveautés
- Les closures dans les expressions constantes : une fonction anonyme statique peut servir de valeur par défaut d'un paramètre ou d'argument d'un attribut ;
- Les handles cURL persistants :
curl_share_init_persistent()réutilise les connexions et le cache DNS d'une requête PHP à l'autre, utile pour une application qui appelle souvent la même API ; - Des messages d'erreur fatale plus utiles, avec une trace d'appel complète.
Les points à vérifier avant de migrer
PHP 8.5 introduit quelques dépréciations qui peuvent remplir vos journaux :
- l'opérateur « backtick » (une commande entourée d'accents graves), alias de
shell_exec(), est déprécié ; - les noms de conversion non canoniques
(integer),(boolean),(double)et(binary)sont dépréciés au profit de(int),(bool),(float)et(string); - utiliser
nullcomme clé de tableau est déprécié ; - terminer un
casepar un point-virgule au lieu de deux-points est déprécié ; - la directive
disable_classesdu fichier php.ini a été supprimée.
Ma méthode de migration reste la même à chaque version : mettre à jour les dépendances avec Composer, lancer les tests, activer l'affichage des dépréciations en environnement de développement, puis corriger avant de basculer la production. Les outils d'analyse statique et Rector automatisent une bonne partie du travail. Pour WordPress, vérifiez que votre thème et vos extensions annoncent la compatibilité.
D'après la page des versions supportées, PHP 8.5 bénéficie du support actif jusqu'à fin 2027 et des correctifs de sécurité jusqu'à fin 2029. La liste complète des changements figure sur la page officielle de PHP 8.5.
Vos sites tournent encore sur une version de PHP qui n'est plus maintenue ? Je peux auditer votre code et planifier la montée de version : contactez-moi.