PHP 8.5 est arrivé : plus intelligent, plus rapide, prêt pour demain.

PHP 8.5 constitue une mise à jour majeure du langage, apportant plusieurs nouveautés importantes, notamment l’extension URI, l’opérateur Pipe, ainsi que la possibilité de modifier des propriétés lors du clonage d’objets.

auteur Aud Mbag Aud Mbag
21 Nov 2025
PHP 8.5 est arrivé : plus intelligent, plus rapide, prêt pour demain.

Extension URI

PHP 8.5 ajoute une extension URI intégrée permettant d’analyser, normaliser et manipuler les URLs selon les standards RFC 3986 et WHATWG URL.

L’extension est toujours disponible et fournit des API sûres pour parser et modifier des URI/URL.

Elle s’appuie sur les bibliothèques uriparser (RFC 3986) et Lexbor (WHATWG URL).

1// PHP 8.4
2$components = parse_url('https://php.net/releases/8.4/en.php');
3 
4var_dump($components['host']);
5// string(7) "php.net"
1// PHP 8.5
2use Uri\Rfc3986\Uri;
3 
4$uri = new Uri('https://php.net/releases/8.5/en.php');
5 
6var_dump($uri->getHost());
7// string(7) "php.net"

Opérateur Pipe

Le nouvel opérateur |> permet d’enchaîner des appels de fonctions de gauche à droite, en faisant circuler les valeurs sans avoir besoin de variables intermédiaires. C’est la fin des appels imbriqués illisibles.

1// PHP 8.4
2$title = ' PHP 8.5 Released ';
3 
4$slug = strtolower(
5 str_replace('.', '',
6 str_replace(' ', '-',
7 trim($title)
8 )
9 )
10);
11 
12var_dump($slug);
13// string(15) "php-85-released"
1// PHP 8.5
2$title = ' PHP 8.5 Released ';
3 
4$slug = $title
5 |> trim(...)
6 |> (fn($str) => str_replace(' ', '-', $str))
7 |> (fn($str) => str_replace('.', '', $str))
8 |> strtolower(...);
9 
10var_dump($slug);
11// string(15) "php-85-released"

Clone With

Il est désormais possible de modifier les propriétés d’un objet directement lors du clonage, en passant un tableau associatif à la fonction clone(). Cela simplifie fortement le “with-er pattern”, notamment pour les classes readonly.

1// PHP 8.4
2readonly class Color
3{
4 public function __construct(
5 public int $red,
6 public int $green,
7 public int $blue,
8 public int $alpha = 255,
9 ) {}
10 
11 public function withAlpha(int $alpha): self
12 {
13 $values = get_object_vars($this);
14 $values['alpha'] = $alpha;
15 
16 return new self(...$values);
17 }
18}
19 
20$blue = new Color(79, 91, 147);
21$transparentBlue = $blue->withAlpha(128);
1// PHP 8.5
2readonly class Color
3{
4 public function __construct(
5 public int $red,
6 public int $green,
7 public int $blue,
8 public int $alpha = 255,
9 ) {}
10 
11 public function withAlpha(int $alpha): self
12 {
13 return clone($this, [
14 'alpha' => $alpha,
15 ]);
16 }
17}
18 
19$blue = new Color(79, 91, 147);
20$transparentBlue = $blue->withAlpha(128);

Attribut #[\NoDiscard]

L’attribut #[\NoDiscard] permet d’émettre un avertissement si la valeur de retour d’une fonction n’est pas utilisée. Très utile pour éviter d’ignorer accidentellement un résultat important.

On peut utiliser (void) pour indiquer explicitement qu’on ignore la valeur.

1// PHP 8.4
2function getPhpVersion(): string
3{
4 return 'PHP 8.4';
5}
6 
7getPhpVersion(); // Pas de warning
1// PHP 8.5
2#[\NoDiscard]
3function getPhpVersion(): string
4{
5 return 'PHP 8.5';
6}
7 
8getPhpVersion();
9// Warning: The return value of function getPhpVersion() should
10// either be used or intentionally ignored by casting it as (void)

Closures et Callables de Première Classe dans les Expressions Constantes

Les closures statiques et les callables de première classe peuvent maintenant être utilisés dans les expressions constantes :

  • paramètres d’attributs
  • valeurs par défaut des propriétés ou paramètres
  • constantes
1// PHP 8.4
2final class PostsController
3{
4 #[AccessControl(
5 new Expression('request.user === post.getAuthor()'),
6 )]
7 public function update(
8 Request $request,
9 Post $post,
10 ): Response {
11 // ...
12 }
13}
1// PHP 8.5
2final class PostsController
3{
4 #[AccessControl(static function (
5 Request $request,
6 Post $post,
7 ): bool {
8 return $request->user === $post->getAuthor();
9 })]
10 public function update(
11 Request $request,
12 Post $post,
13 ): Response {
14 // ...
15 }
16}

Handles cURL partagés persistants

Les handles créés avec curl_share_init_persistent() ne sont plus détruits en fin de requête PHP. S’il existe déjà un handle persistant avec les mêmes options, il sera réutilisé, évitant le coût de réinitialisation.

1// PHP 8.4
2$sh = curl_share_init();
3curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
4curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_CONNECT);
5 
6$ch = curl_init('https://php.net/');
7curl_setopt($ch, CURLOPT_SHARE, $sh);
8 
9curl_exec($ch);
1// PHP 8.5
2$sh = curl_share_init_persistent([
3 CURL_LOCK_DATA_DNS,
4 CURL_LOCK_DATA_CONNECT,
5]);
6 
7$ch = curl_init('https://php.net/');
8curl_setopt($ch, CURLOPT_SHARE, $sh);
9 
10// Il est désormais possible de réutiliser la connexion d'une requête SAPI précédente.
11curl_exec($ch);

Nouvelles fonctions array_first() et array_last()

array_first() et array_last() retournent respectivement la première ou la dernière valeur d’un tableau. Si le tableau est vide, elles retournent null.

1// PHP 8.4
2$lastEvent = $events === []
3 ? null
4 : $events[array_key_last($events)];
1// PHP 8.5
2$lastEvent = array_last($events);

Autres améliorations

  • Les Fatal Errors incluent désormais une backtrace.

  • Les attributs peuvent maintenant cibler des constantes.

  • L’attribut #[\Override] peut être appliqué aux propriétés.

  • L’attribut #[\Deprecated] peut être utilisé sur les traits et les constantes.

  • Les propriétés statiques supportent l'accessibilité asymétrique.

  • Les propriétés peuvent être final via la promotion des propriétés du constructeur.

  • Ajout de Closure::getCurrent() pour simplifier la récursion.

  • setcookie() et setrawcookie() supportent la clé partitioned.

  • Nouvelles fonctions :

    • get_error_handler()
    • get_exception_handler()
  • Ajouts dans l’API DOM :

    • Dom\Element::getElementsByClassName()
    • Dom\Element::insertAdjacentHTML()
  • Nouvelle fonction grapheme_levenshtein().

  • Nouvel attribut #[\DelayedTargetValidation] pour ignorer certaines erreurs de validation compile-time.

Dépréciations et ruptures de compatibilité

  • Les backticks comme alias de shell_exec() sont dépréciés.
  • Les cast non canoniques (boolean), (integer), (double), (binary) sont dépréciés.
  • Le réglage INI disable_classes a été supprimé.
  • Terminer un case par un ; au lieu d’un : est déprécié.
  • Utiliser null comme offset de tableau est déprécié : utiliser ''.
  • Impossible désormais d’utiliser array ou callable comme alias de classe.
  • __sleep() et __wakeup() sont dépréciées au profit de __serialize() / __unserialize().
  • Avertissement lors du cast de NAN.
  • Avertissement lorsqu’on destructure autre chose qu’un tableau.
  • Avertissement lors du cast de floats non représentables en int.

Voir aussi

https://www.php.net/releases/8.5

Sommaire

--------------