Php

PHP 8.5 : Toutes les nouveautés à connaître

· 4 min de lecture

PHP 8.5 est sorti le 20 novembre 2025 et c'est une version majeure. Pipe operator, clone with, nouvelles fonctions, attributs... Voici un tour d'horizon complet des nouveautés les plus importantes.

Le Pipe Operator

C'est LA feature star de PHP 8.5. Le pipe operator permet de chaîner des appels de fonctions de gauche à droite, en passant le résultat de l'expression précédente comme argument. Fini les fonctions imbriquées illisibles !

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

  // Résultat : "php-8.5-released"

Le code se lit maintenant naturellement, étape par étape. C'est un vrai game-changer pour le code fonctionnel.

Clone With : modifier des propriétés readonly

Impossible auparavant de modifier une propriété readonly après construction, même via un clone. PHP 8.5 introduit clone() avec un tableau de propriétés à modifier :

  readonly class Color
  {
      public function __construct(
          public int $red,
          public int $green,
          public int $blue,
          public int $alpha = 255,
      ) {}

      public function withAlpha(int $alpha): self
      {
          return clone($this, ['alpha' => $alpha]);
      }
  }

  $color = new Color(255, 0, 0);
  $transparent = $color->withAlpha(128);
  // $transparent->alpha === 128, l'original reste inchangé

C'est une avancée énorme pour les value objects et les patterns immutables.

L'attribut NoDiscard

Combien de fois avez-vous oublié de vérifier la valeur de retour d'une fonction critique ? PHP 8.5 permet de marquer les fonctions dont le retour ne doit pas être ignoré :

  #[\NoDiscard("Le résultat de l'opération doit être vérifié")]
  function performOperation(): Result
  {
      return new Result(success: true);
  }

  performOperation();             // Warning émis
  $result = performOperation();   // OK
  (void) performOperation();      // OK - ignoré explicitement

  array_first() et array_last()

Enfin ! Deux fonctions natives pour récupérer le premier et le dernier élément d'un tableau, sans toucher au pointeur interne :

  $fruits = ['pomme', 'banane', 'cerise'];

  array_first($fruits);  // "pomme"
  array_last($fruits);   // "cerise"
  array_first([]);       // null

Plus besoin de reset(), end(), ou array_key_first() avec accès par clé.

Extension URI/URL native

PHP 8.5 embarque une extension de parsing d'URL conforme aux standards, avec des objets immutables :

  use Uri\Rfc3986\Uri;

  $uri = new Uri('https://example.com/a/../b?x=1#frag');
  echo $uri->getHost();     // "example.com"

  $uri = $uri->withPath('/new-path');
  echo (string) $uri;       // "https://example.com/new-path?x=1#frag"

Deux implémentations sont disponibles : Uri\Rfc3986\Uri (stricte RFC) et Uri\WhatWg\Url (compatible navigateurs).

Closures dans les expressions constantes

Les closures statiques et la syntaxe first-class callable peuvent maintenant être utilisées dans les constantes de classe :

  class Transformers
  {
      public const UPPER = strtoupper(...);
      public const LOWER = strtolower(...);

      public const NORMALIZE = static function(string $v): string {
          return trim(strtolower($v));
      };
  }

Propriétés final promues

Les propriétés promues dans le constructeur peuvent désormais être déclarées final :

  class User
  {
      public function __construct(
          final public readonly string $id,
          public string $name,
      ) {}
  }

  class AdminUser extends User
  {
      // Impossible de redéfinir $id - c'est final
  }

Backtraces sur les erreurs fatales

La directive INI fatal_error_backtraces (activée par défaut) ajoute une stack trace complète aux erreurs fatales. Plus besoin de deviner d'où vient le crash.

FILTER_THROW_ON_FAILURE

filter_var() peut maintenant lancer une exception au lieu de retourner false :

  try {
      $email = filter_var($input, FILTER_VALIDATE_EMAIL, FILTER_THROW_ON_FAILURE);
  } catch (FilterFailedException $e) {
      // Input invalide
  }

IntlListFormatter

Formater des listes avec la bonne ponctuation selon la locale :

  $lf = new IntlListFormatter('fr', IntlListFormatter::TYPE_CONJUNCTION);
  echo $lf->format(['pommes', 'bananes', 'oranges']);
  // "pommes, bananes et oranges"

Les dépréciations à connaître

PHP 8.5 prépare le terrain pour PHP 9.0 avec plus de 30 dépréciations. Les plus notables : le backtick operator remplacé par shell_exec(), les casts longs (boolean) et (integer) en faveur de (bool) et (int), et __sleep() / __wakeup() au profit de __serialize() / __unserialize().

Conclusion

PHP 8.5 est une release solide qui améliore significativement l'ergonomie du langage. Le pipe operator et le clone with sont les stars, mais les petites additions comme array_first(), NoDiscard et les closures constantes vont rapidement devenir indispensables au quotidien.

Il est temps de mettre à jour vos projets !