Home Blog Nouveautés PHP 8.5

Nouveautés PHP 8.5

  Loïc Zambuto 15 min 3 décembre 2025

Le 20 novembre 2025 marque la sortie officielle de PHP8.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.

[pastacode lang= »php » manual= »%3C%3Fphp%0A%0A%24text%20%3D%20strtolower(str_replace(‘%20’%2C%20’-‘%2C%20trim(‘%20Hello-World%20’)))%20%3B%0A%0Aecho%20%24text%20%3B%0A%2F%2F%20hello%20world » message= »PHP 8.4 ou antérieur » highlight= » » provider= »manual »/]

[pastacode lang= »php » manual= »%3C%3Fphp%0A%0A%24text%20%3D%20’%20Hello-World%20’%0A%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20%7C%3E%20trim(…)%0A%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20%7C%3E%20(fn(%24s)%20%3D%3E%20str_replace(‘-‘%2C%20’%20’%2C%20%24s))%0A%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20%7C%3E%20strtolower(…)%3B%0A%0Aecho%20%24text%20%3B%0A%2F%2F%20hello%20world » message= »PHP 8.5″ highlight= » » provider= »manual »/]

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

[pastacode lang= »php » manual= »%3C%3Fphp%0A%0A%0Areadonly%20class%20Vehicle%0A%7B%0A%C2%A0%C2%A0%C2%A0%20public%20function%20__construct(%0A%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20public%20string%20%24brand%2C%0A%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20public%20int%20%24power%20%3D%20200%0A%C2%A0%C2%A0%C2%A0%20)%20%7B%7D%0A%0A%C2%A0%C2%A0%C2%A0%20public%20function%20withPower(int%20%24power)%3A%20self%0A%C2%A0%C2%A0%C2%A0%20%7B%0A%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20%2F%2F%20On%20r%C3%A9cup%C3%A8re%20toutes%20les%20propri%C3%A9t%C3%A9s%20de%20l’objet%0A%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20%24values%20%3D%20get_object_vars(%24this)%3B%0A%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20%2F%2F%20On%20modifie%20la%20propri%C3%A9t%C3%A9%20souhait%C3%A9e%0A%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20%24values%5B’power’%5D%20%3D%20%24power%3B%0A%0A%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20%2F%2F%20On%20cr%C3%A9e%20une%20nouvelle%20instance%20avec%20les%20valeurs%20modifi%C3%A9es%0A%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20return%20new%20self(…%24values)%3B%0A%C2%A0%C2%A0%C2%A0%20%7D%0A%7D%0A%0A%24car%20%3D%20new%20Vehicle(‘Tesla’%2C%20200)%3B%0A%24fastCar%20%3D%20%24car-%3EwithPower(250)%3B%0A%0Aecho%20%22%7B%24car-%3Ebrand%7D%20-%20%7B%24car-%3Epower%7D%20ch%5Cn%22%3B%C2%A0%C2%A0%C2%A0%C2%A0%20%2F%2F%20Tesla%20-%20200%20ch%0Aecho%20%22%7B%24fastCar-%3Ebrand%7D%20-%20%7B%24fastCar-%3Epower%7D%20ch%5Cn%22%3B%20%2F%2F%20Tesla%20%E2%80%93%20250%20ch » message= »PHP 8.4 ou antérieur » highlight= » » provider= »manual »/]

[pastacode lang= »php » manual= »%3C%3Fphp%0A%0Areadonly%20class%20Vehicle%0A%7B%0A%C2%A0%C2%A0%C2%A0%20public%20function%20__construct(%0A%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20public%20string%20%24brand%2C%0A%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20public%20int%20%24power%20%3D%20200%0A%C2%A0%C2%A0%C2%A0%20)%20%7B%7D%0A%0A%C2%A0%C2%A0%C2%A0%20public%20function%20withPower(int%20%24power)%3A%20self%0A%C2%A0%C2%A0%C2%A0%20%7B%0A%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20%2F%2F%20Nouveau%20%3A%20clone%20avec%20modifications%20directes%0A%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20return%20clone(%24this%2C%20%5B%0A%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20’power’%20%3D%3E%20%24power%2C%0A%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20%5D)%3B%0A%C2%A0%C2%A0%C2%A0%20%7D%0A%7D%0A%0A%24car%20%3D%20new%20Vehicle(‘Tesla’%2C%20200)%3B%0A%24fastCar%20%3D%20%24car-%3EwithPower(250)%3B%0A%0Aecho%20%22%7B%24car-%3Ebrand%7D%20-%20%7B%24car-%3Epower%7D%20ch%5Cn%22%3B%C2%A0%C2%A0%C2%A0%C2%A0%20%2F%2F%20Tesla%20-%20200%20ch%0Aecho%20%22%7B%24fastCar-%3Ebrand%7D%20-%20%7B%24fastCar-%3Epower%7D%20ch%5Cn%22%3B%20%2F%2F%20Tesla%20%E2%80%93%20250%20ch » message= »PHP 8.5″ highlight= » » provider= »manual »/]

Extension URI native

Cela permet de standardiser la manipulation des URLs.

[pastacode lang= »php » manual= »%3C%3Fphp%0A%0A%24url%20%3D%20’https%3A%2F%2Fwebnet.fr%2Fpath%3Ffoo%3D1%23bar’%3B%0A%24parts%20%3D%20parse_url(%24url)%3B%0A%0Aecho%20%24parts%5B’host’%5D%3B%0A%2F%2F%20%22webnet.fr%22″ message= »PHP 8.4 ou antérieur » highlight= » » provider= »manual »/]

[pastacode lang= »php » manual= »%3C%3Fphp%0A%0Ause%20Uri%5CRfc3986%5CUri%3B%0A%0A%24uri%20%3D%20new%20Uri(‘https%3A%2F%2Fwebnet.fr%2Fpath%3Ffoo%3D1%23bar’)%3B%0Aecho%20%24uri-%3EgetHost()%3B%0A%2F%2F%20%22webnet.fr%22″ message= »PHP 8.5″ highlight= » » provider= »manual »/]

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

[pastacode lang= »php » manual= »%3C%3Fphp%0A%0A%24arr%20%3D%20%5B10%2C%2020%2C%2030%5D%3B%0A%0A%24first%20%3D%20reset(%24arr)%3B%20%2F%2F%20renvoie%2010%0A%24last%C2%A0%20%3D%20end(%24arr)%3B%C2%A0%C2%A0%20%2F%2F%20renvoie%2030″ message= »PHP 8.4 ou antérieur » highlight= » » provider= »manual »/]

[pastacode lang= »php » manual= »%3C%3Fphp%0A%0A%24arr%20%3D%20%5B10%2C%2020%2C%2030%5D%3B%0A%0A%24first%20%3D%20array_first(%24arr)%3B%20%2F%2F%20renvoie%2010%0A%24last%C2%A0%20%3D%20array_last(%24arr)%3B%C2%A0%20%2F%2F%20renvoie%2030%0A%0A%24users%20%3D%20%5B%5D%3B%0A%0A%24firstUser%20%3D%20array_first(%24users)%20%3F%3F%20’Aucun%20utilisateur’%3B%0A%24lastUser%C2%A0%20%3D%20array_last(%24users)%C2%A0%20%3F%3F%20’Aucun%20utilisateur’%3B%0A%0Aecho%20%24firstUser%3B%20%2F%2F%20Affiche%20%3A%20Aucun%20utilisateur%0Aecho%20%24lastUser%3B%C2%A0%20%2F%2F%20Affiche%20%3A%20Aucun%20utilisateur » message= »PHP 8.5″ highlight= » » provider= »manual »/]

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.

[pastacode lang= »php » manual= »%3C%3Fphp%0A%0Afunction%20getTotal(float%20%24subtotal%2C%20float%20%24tax)%3A%20float%0A%7B%0A%C2%A0%C2%A0%C2%A0%20return%20%24subtotal%20%2B%20%24tax%3B%0A%7D%0AgetTotal(10.5%2C%202)%3B%0A%2F%2FPas%20de%20warning » message= »PHP 8.4 ou antérieur » highlight= » » provider= »manual »/]

[pastacode lang= »php » manual= »%3C%3Fphp%0A%0A%23%5B%5CNoDiscard%5D%0Afunction%20getTotal(float%20%24subtotal%2C%20float%20%24tax)%3A%20float%0A%7B%0A%C2%A0%C2%A0%C2%A0%20return%20%24subtotal%20%2B%20%24tax%3B%0A%7D%0A%0AgetTotal(10.5%2C%202)%3B%0A%2F%2FWarning%3A%20The%20return%20value%20of%20function%20getTotal()%20should%20either%20be%20used%20or%20intentionally%20ignored%20by%20casting%20it%20as%20(void)%20in%20php%20shell%20code%20on%20line%207″ message= »PHP 8.5″ highlight= » » provider= »manual »/]

Closures & First-Class Callables dans les expressions constantes

Jusqu’à PHP 8.4, on ne pouvait 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.

[pastacode lang= »php » manual= »%3C%3Fphp%0A%0A%23%5BApiResource(%0A%C2%A0%C2%A0%C2%A0%20security%3A%20new%20Expression(%22user.id%20%3D%3D%3D%20object.getAuthor().id%22)%0A)%5D%0Aclass%20Post%0A%7B%0A%C2%A0%C2%A0%C2%A0%20public%20string%20%24title%3B%0A%7D » message= »PHP 8.4 ou antérieur » highlight= » » provider= »manual »/]

[pastacode lang= »php » manual= »%3C%3Fphp%0A%0A%23%5BApiResource(%0A%C2%A0%C2%A0%C2%A0%20security%3A%20static%20fn%20(%24object%2C%20%24user)%3A%20bool%20%3D%3E%0A%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20%24user-%3Eid%20%3D%3D%3D%20%24object-%3EgetAuthor()-%3Eid%0A)%5D%0Aclass%20Post%0A%7B%0A%C2%A0%C2%A0%C2%A0%20public%20string%20%24title%3B%0A%7D » message= »PHP 8.5″ highlight= » » provider= »manual »/]


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é PHP8.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 PHP rendez-vous sur webnet.fr.

Lire les articles similaires

Laisser un commentaire

Social Share Buttons and Icons powered by Ultimatelysocial