Le 20 novembre 2025 marque la sortie officielle de PHP 8.5, une mise à jour majeure du langage PHP. Cette version apporte de nouvelles fonctionnalités importantes, notamment l’extension URI, l’opérateur Pipe pour chaîner les opérations de manière fonctionnelle, ainsi que le support pour modifier les propriétés lors du clonage d’objets immuables. PHP 8.5 améliore également la lisibilité du code, les performances, et la sécurité, tout en introduisant des dépréciations pour encourager le nettoyage du code legacy.
Voici un tour d’horizon avec comparatifs PHP 8.4 pour mieux comprendre les changements.
Les nouveautés
L’opérateur Pipe (|>)
Le pipe operator permet de chaîner les traitements de gauche à droite de manière claire et fonctionnelle.
Cela réduit les variables temporaires et d’améliore la lisibilité du code.
Clone avec modification (“with‑er” pattern)
En PHP 8.5, il est possible de modifier directement des propriétés lors du clonage d’un objet.
Avant, il fallait récupérer toutes les propriétés et créer une nouvelle instance manuellement.
Cette nouveauté simplifie le pattern “with”, le rendant plus lisible et compact, surtout pour les objets immuables (readonly).
Extension URI native
Cela permet de standardiser la manipulation des URLs.
Nouvelles fonctions array_first() et array_last()
Introduction de deux nouvelles fonctions pratiques pour travailler avec les tableaux : array_first() et array_last(). Ces fonctions simplifient la récupération de la première ou de la dernière valeur d’un tableau, en remplaçant l’usage plus ancien de reset() et end().
Comportement
- array_first(array $array): mixed : retourne le premier élément du tableau.
- array_last(array $array): mixed : retourne le dernier élément du tableau.
- Si le tableau est vide, ces fonctions retournent null, ce qui les rend plus simple l’utilisation de l’opérateur ??.
L’attribut : #[\NoDiscard]
En ajoutant l’attribut #[\NoDiscard] à une fonction, PHP vérifie si la valeur retournée est utilisée et émet un avertissement si ce n’est pas le cas.
Cela permet d’améliorer la sécurité des API dont la valeur de retour est importante, mais où il est facile d’oublier de l’utiliser par accident.
La conversion explicite en (void) peut être utilisée pour indiquer qu’une valeur est volontairement ignorée.
Closures & First-Class Callables dans les expressions constantes
Jusqu’à PHP 8.4, tu ne pouvais pas utiliser de closures (fonctions anonymes) ou de first-class callables à des endroits qui exigent des expressions constantes :
- les paramètres d’attributs,
- les valeurs par défaut de propriétés ou de paramètres,
- les constantes de classe.
En PHP 8.5, on autorise l’utilisation de :
- closures statiques (static function () { … })
- first-class callables (foo(…), ClassName::method(…))
dans des expressions considérées comme constantes, y compris dans les attributs.
Fonctionnalités et améliorations supplémentaires
Persistent cURL Share Handles
Contrairement à curl_share_init(), les handles créés par curl_share_init_persistent() ne seront pas détruits à la fin de la requête PHP.
Si un handle de partage persistant possédant le même ensemble d’options de partage est trouvé, il sera réutilisé, ce qui évite le coût d’initialisation des handles cURL à chaque fois.
Amélioration des erreurs fatales
Les erreurs fatales (comme un dépassement du temps d’exécution maximum) incluent désormais une trace complète.
Attributs étendus
- Les attributs peuvent désormais cibler les constantes.
- L’attribut #[\Override] peut maintenant être appliqué aux propriétés.
- L’attribut #[\Deprecated] peut maintenant être utilisé sur les traits et les constantes.
- Nouvel attribut #[\DelayedTargetValidation] : permet de supprimer les erreurs à la compilation pour les attributs utilisés sur des cibles invalides.
Propriétés statiques et finales
- Les propriétés statiques supportent désormais une visibilité asymétrique.
- Les propriétés peuvent être marquées comme finales via le constructor property promotion.
Fonctions et méthodes supplémentaires
- Ajout de la méthode Closure::getCurrent() pour simplifier la récursion dans les fonctions anonymes.
- setcookie() et setrawcookie() supportent désormais la clé partitionnée.
- Les 2 nouvelles fonctions get_error_handler() et get_exception_handler() permettent de récupérer dynamiquement les gestionnaires en cours
- Nouvelles méthodes DOM : Dom\Element::getElementsByClassName() et Dom\Element::insertAdjacentHTML().
- Nouvelle fonction grapheme_levenshtein().
Dépréciations et ruptures de compatibilité
| Fonctionnalité | PHP 8.4 | PHP 8.5 |
| Backticks command | ✅ | ❌ Déprécié |
| Casts (integer), (boolean), (double), (binary) | ✅ | ❌ Déprécié |
| disable_classes INI | ✅ | ❌ Supprimé |
| Terminer un case par ; au lieu de : | ✅ | ❌ Déprécié |
| null comme offset de tableau ou array_key_exists() | ✅ | ❌ Déprécié |
| array et callable comme alias de classe | ✅ | ❌ Interdit |
| __sleep() et __wakeup() | ✅ | ⚠️ Soft-déprécié
(__serialize() / __unserialize() à utiliser) |
| Cast NAN vers d’autres types | ✅ | ⚠️ Warning |
| Déstructuration de valeurs non-tableau | ✅ | ⚠️ Warning |
| Cast float/string vers int impossible | ✅ | ⚠️ Warning |
Cycle de vie
Date de sortie : 20 novembre 2025
Fin du support actif (bug fixes + sécurité) : 31 décembre 2027
Fin du support de sécurité (EOL) : 31 décembre 2029
Pour en savoir plus sur nos expertises rendez-vous sur webnet.fr.