- Extension URI
- Opérateur Pipe
- Clone With
- Attribut #[\NoDiscard]
- Closures et Callables de Première Classe dans les Expressions Constantes
- Handles cURL partagés persistants
- Nouvelles fonctions array_first() et array_last()
- Autres améliorations
- Dépréciations et ruptures de compatibilité
- Voir aussi
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.42$components = parse_url('https://php.net/releases/8.4/en.php');3 4var_dump($components['host']);5// string(7) "php.net"1// PHP 8.52use 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): self12 {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): self12 {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.42function getPhpVersion(): string3{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() should10// 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.42$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.42$lastEvent = $events === []3 ? null4 : $events[array_key_last($events)];1// PHP 8.52$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
finalvia la promotion des propriétés du constructeur. -
Ajout de
Closure::getCurrent()pour simplifier la récursion. -
setcookie()etsetrawcookie()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_classesa été supprimé. - Terminer un
casepar un;au lieu d’un:est déprécié. - Utiliser
nullcomme offset de tableau est déprécié : utiliser''. - Impossible désormais d’utiliser
arrayoucallablecomme 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.