PHP 8.5 : les nouveautés qui comptent vraiment pour le backend
PHP 8.5 apporte l'opérateur pipe, le parsing d'URI natif et un pattern with-er propre pour les classes readonly. Voici ce qui change au quotidien.
PHP 8.5 est sorti le 20 novembre 2025 et reste en support actif jusqu'à fin 2027, avec des correctifs de sécurité jusqu'en 2029. Ce n'est pas une release aussi marquante que les union types de 8.0 ou les enums de 8.1, mais plusieurs ajouts résolvent de vrais points de friction du code backend au quotidien,surtout si vous écrivez du Laravel ou du Symfony.
L'opérateur pipe : |>
L'opérateur pipe chaîne des callables de gauche à droite sans variables intermédiaires ni appels de fonction imbriqués. Ça se lit comme un pipeline de données plutôt qu'une pile de parenthèses.
// Avant : appels imbriqués, à lire de l'intérieur vers l'extérieur
$result = strtoupper(trim(str_replace('_', ' ', $rawInput)));
// PHP 8.5 : opérateur pipe, à lire de gauche à droite
$result = $rawInput
|> fn ($s) => str_replace('_', ' ', $s)
|> trim(...)
|> strtoupper(...);Parsing d'URI natif
PHP embarque enfin une extension URI native implémentant la RFC 3986 et le standard WHATWG URL, plutôt que de forcer tout le monde à utiliser parse_url() et à gérer les cas limites de normalisation à la main.
use Uri\Rfc3986\Uri;
$uri = Uri::parse('https://api.exemple.com/v1/users?page=2');
echo $uri->getHost(); // api.exemple.com
echo $uri->getPath(); // /v1/users
$uri->getQuery()->get('page'); // "2"clone() avec modification de propriétés
Les classes readonly et value objects nécessitaient jusque-là une méthode "with" manuelle pour chaque mise à jour immuable (withStatus(), withEmail(), etc.). La nouvelle syntaxe clone() permet de cloner un objet et de surcharger des propriétés spécifiques en une seule expression.
final readonly class Money
{
public function __construct(
public int $amount,
public string $currency,
) {}
}
$price = new Money(1000, 'EUR');
// Au lieu d'une méthode withAmount() écrite à la main :
$discounted = clone($price, ['amount' => 800]);L'attribut #[\NoDiscard]
Marquer une méthode avec #[\NoDiscard] fait émettre un avertissement PHP quand sa valeur de retour est ignorée,ça attrape toute une classe de bugs où une méthode qui retourne une nouvelle instance (au lieu de muter sur place) est appelée sans que son résultat soit utilisé.
final readonly class Money
{
#[\NoDiscard]
public function add(Money $other): self
{
return new self($this->amount + $other->amount, $this->currency);
}
}
$price->add($fee); // déclenche maintenant un avertissement : valeur de retour ignorée
$price = $price->add($fee); // usage correctPetits gains utiles
- ✓array_first() et array_last() retournent le premier et le dernier élément sans passer par reset()/end()
- ✓Les fatal errors incluent désormais un backtrace complet,fini de deviner quelle chaîne d'appels a déclenché un crash dans les logs de prod
- ✓get_error_handler() et get_exception_handler() permettent d'inspecter les handlers actuellement enregistrés
- ✓Dom\Element::getElementsByClassName() et insertAdjacentHTML() comblent des manques historiques de l'API DOM native
Aucune des fonctionnalités de PHP 8.5 n'est un changement cassant,c'est une migration sûre pour la majorité des codebases. La vraie valeur est incrémentale : adopter l'opérateur pipe dans le nouveau code, utiliser clone() avec modification de propriétés pour vos value objects readonly, et laisser les backtraces des fatal errors faire gagner du temps en debug de production.
PHP continue de prouver qu'un langage mature peut encore améliorer son ergonomie release après release sans casser la compatibilité ascendante. Aucune de ces fonctionnalités n'impose de réécriture,ce sont des outils à utiliser la prochaine fois que vous touchez le code.
Besoin d'aide sur ce sujet ? Développement Full Stack
Découvrir ce service →