PHP 8.5 est sorti le 20 novembre 2025. Cette version continue la dynamique de PHP 8.x : plus de productivité, meilleure DX et un langage qui vous pousse vers les bonnes pratiques sans casser tout votre code.
Dans cet article, on passe en revue les nouveautés majeures, les changements subtils (mais importants) et ce que vous devez vérifier avant de passer votre stack en 8.5.
PHP 8.5 en un coup d’œil
En bref, PHP 8.5 apporte :
- L’opérateur pipe
|>pour chaîner les appels de manière lisible. - Une nouvelle extension URI native pour parser et manipuler les URLs proprement.
clone()amélioré avec un paramètre pour modifier des propriétés pendant le clonage.- L’attribut
#[\NoDiscard]pour signaler les retours à ne pas ignorer. - Closures et first-class callables utilisables dans les expressions constantes.
- Nouvelles fonctions utilitaires comme
array_first(),array_last(),get_error_handler(),get_exception_handler(). - OPcache obligatoire, intégré au binaire PHP.
- Stack trace sur les erreurs fatales et nouvelles options de debug.
- Une salve de dépréciations ciblées (backticks, casts non canoniques, etc.).
L’opérateur pipe |> : fini la salade d’appels imbriqués
C’est la star de PHP 8.5. L’opérateur pipe permet de chaîner des appels de fonctions en lisant le flux de gauche à droite.
Avant : du code illisible
<?php
$title = ' PHP 8.5 Released ';
$slug = strtolower(
str_replace('.', '',
str_replace(' ', '-',
trim($title)
)
)
);Code language: PHP (php)
Maintenant : des pipelines explicites
<?php
$title = ' PHP 8.5 Released ';
$slug = $title
|> trim(...)
|> (fn (string $str): string => str_replace(' ', '-', $str))
|> (fn (string $str): string => str_replace('.', '', $str))
|> strtolower(...);Code language: HTML, XML (xml)
Quelques points clés :
- La valeur de gauche est passée implicitement comme premier argument des callables de droite.
- Vous pouvez utiliser des fonctions, des closures, des first-class callables (
$obj->method(...),Class::staticMethod(...)). - Le pipe ne remplace pas tout, mais il rend les transformations successives nettement plus lisibles, surtout combiné avec les fonctions pures.
En pratique, vous allez l’adorer pour :
- Le nettoyage de données (normalisation d’input, trimming, filtering).
- Les pipelines sur des collections (combiner
array_map,array_filter,array_values, etc.). - Les transformations de chaînes et les générateurs.
clone() évolue : le “clone with” version PHP
PHP 8.5 introduit un clone() amélioré, capable de cloner un objet et de modifier certaines propriétés en une seule opération.
Avant, pour un objet readonly, il fallait bricoler :
<?php
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 {
$values = get_object_vars($this);
$values['alpha'] = $alpha;
return new self(...$values);
}
}
$blue = new Color(79, 91, 147);
$transparentBlue = $blue->withAlpha(128);Code language: HTML, XML (xml)
Avec PHP 8.5, clone() accepte désormais un second argument $withProperties :
<?php
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,
]);
}
}
$blue = new Color(79, 91, 147);
$transparentBlue = $blue->withAlpha(128);Code language: HTML, XML (xml)
Ce que ça change pour vous :
- Le pattern with-er devient trivial, même avec des propriétés
readonly. - Vous réduisez le boilerplate autour de l’immutabilité.
- Les objets de configuration, DTO et value objects deviennent plus agréables à manipuler.