Les nouveautés de PHP 8.5
(stitcher.io)- PHP 8.5 est une mise à jour majeure qui inclut plusieurs fonctionnalités comme l’opérateur pipe, clone with et un nouveau parseur d’URI
- L’opérateur pipe simplifie les chaînes d’appels de fonctions, ce qui améliore la lisibilité et la maintenabilité
- La fonctionnalité Clone with permet de modifier en même temps les valeurs des propriétés lors de la copie d’un objet, avec certaines restrictions sur des propriétés readonly
- Des améliorations de confort pour les développeurs ont été ajoutées, comme
#[NoDiscard], le cast(void), la prise en charge des closures dans les expressions constantes et l’affichage de backtraces pour les fatal errors - Cette version comprend aussi des améliorations détaillées sur le traitement des tableaux, la validation des attributs, la dépréciation de casts non standard, ainsi que des changements liés à la rétrocompatibilité
Principales nouveautés
-
Introduction de l’opérateur pipe (
|>), qui permet d’écrire du code chaîné en transmettant directement le résultat d’une fonction à la suivante- Prend en charge une structure de transformation des données étape par étape, au lieu d’appels de fonctions imbriqués
- L’exemple de code enchaîne successivement
trim,str_replace,strtolower, etc.
-
La fonctionnalité Clone with permet de modifier des valeurs de propriétés en même temps que la copie d’un objet
- Dans la classe d’exemple
Book, elle s’utilise sous la formeclone($this, ['title' => $title]) - En revanche, lors de la copie depuis l’extérieur de propriétés readonly, un modificateur d’accès
public(set)est nécessaire
- Dans la classe d’exemple
-
Ajout de l’attribut
#[NoDiscard]et du cast(void)- Il devient possible de marquer des fonctions qui déclenchent un avertissement si leur valeur de retour est ignorée
- Le cast
(void)permet de supprimer cet avertissement
-
Grâce aux améliorations des closures, il est désormais possible d’utiliser des closures et des callable objects de premier ordre dans des expressions constantes
- L’exemple les définit dans un attribut sous la forme
#[SkipDiscovery(static function (...))] - Ces closures doivent impérativement être déclarées avec
staticet ne peuvent pas accéder à des variables externes
- L’exemple les définit dans un attribut sous la forme
-
Ajout de l’affichage de backtraces pour les fatal errors
- Des informations de stack trace auparavant absentes sont désormais incluses dans les messages d’erreur, ce qui facilite le débogage
Fonctions liées aux tableaux et aux URI
-
Ajout des fonctions
array_first()etarray_last()- Elles renvoient simplement le premier et le dernier élément d’un tableau
- Elles remplacent une approche plus complexe basée sur
array_key_first()etarray_key_last()
-
Ajout d’un nouveau parseur d’URI
- La classe
Uri\Rfc3986\Urifournit des méthodes commegetHost(),getScheme(),getPort(), etc. - Cela simplifie la manipulation et l’analyse des URI
- La classe
Fonctions liées aux attributs et à la validation
- Introduction de l’attribut
#[DelayedTargetValidation]- Il permet, pour certains attributs comme
#[Override], de retarder la validation de la compilation vers l’exécution - L’objectif est d’atténuer certains problèmes de rétrocompatibilité
- Il permet, pour certains attributs comme
Autres petits changements
- Prise en charge de la visibilité asymétrique pour les propriétés statiques
- Il est désormais possible d’ajouter des attributs à des constantes hors classe
- La property promotion du constructeur peut désormais s’appliquer à des propriétés final
- L’attribut
#[\Override]peut désormais aussi s’appliquer aux propriétés - Ajout de la propriété
Dom\Element::$outerHTML - L’extension Exif prend en charge les images HEIF/HEIC
- Ajout du flag
FILTER_THROW_ON_FAILURElors d’un appel àfilter_var()
Dépréciations et changements incompatibles
- Abandon de l’usage des noms de cast non standard comme
(boolean)ou(integer) - Dépréciation de l’utilisation des backticks (```) comme alias de
shell_exec() - Dépréciation de la fonctionnalité de redéclaration de constantes
- Suppression du paramètre ini
disabled_classes - La liste complète des changements et dépréciations est disponible dans le document de migration vers PHP 8.5
Résumé général
- PHP 8.5 est une version qui améliore l’expérience de développement de manière globale, notamment en matière de lisibilité du code, débogage, gestion des attributs et manipulation des tableaux
- L’opérateur pipe et le parseur d’URI ont un impact direct sur la simplification du code en pratique
- Le report de validation des attributs, les nouvelles fonctions de tableau et l’affichage des backtraces renforcent la maintenabilité et la stabilité
- La dépréciation de certaines syntaxes et configurations non standard impose un peu de nettoyage dans le code
- Globalement, il s’agit d’une release centrée sur le renforcement de la cohérence du langage et l’amélioration du confort des développeurs
1 commentaires
Avis Hacker News
J’aime toujours PHP
J’ai créé il y a 23 ans un logiciel de chiffrement pour PHP, et il fonctionne encore très bien aujourd’hui
Je publie toujours une newsletter sur PHP, et la communauté reste très solide
J’utilise aussi Python et Node.js, mais pour les tâches rapides et simples, je finis toujours par revenir à PHP
Cela dit, le fait que PHP soit devenu bien plus complexe depuis PHP 5 est une arme à double tranchant
Pendant que Python passait de 2 à 3, PHP a évolué de 5.2→5.3 puis de 5.6→7.0
Les espaces de noms, l’autoloading PSR0, les améliorations du parseur, etc., ont fortement amélioré la vitesse et la structure
À chaque mise à jour, le langage s’est amélioré progressivement sans casser la compatibilité, et il a fourni des avertissements ainsi que des shim pour permettre de conserver les anciennes versions
PHP 6 a été annulé à cause des changements du traitement des chaînes, et au final c’était probablement une décision judicieuse
C’était un projet qui respectait à la fois un langage et une communauté qui m’ont fait vivre pendant longtemps
On peut écrire de manière compliquée, mais ce n’est pas une obligation
J’ai manipulé des outils liés à Zend au milieu des années 2000, et j’en garde le souvenir de quelque chose d’assez délicat
En apprenant les PSR et en tenant compte de la sécurité et des fonctionnalités, c’est devenu un langage bien plus stable et puissant
L’évolution depuis PHP 5 est impressionnante, mais elle s’accompagne aussi d’un vrai problème de complexité croissante
Pour ceux qui ont appris avec les anciennes versions, les bases de code récentes paraissent étrangères et difficiles à suivre
C’est une force pour la communauté, mais une barrière pour les développeurs qui veulent revenir
J’ai fait du C++ pendant 10 ans, mais aujourd’hui PHP est bien plus facile à lire que du code C++ moderne
On a l’impression que l’objectif de simplicité a disparu, et qu’on ne fait qu’empiler des fonctionnalités
Le web évolue particulièrement vite, donc si on ne suit pas, on se fait dépasser
PHP est un langage particulièrement utilisé par les débutants qui créent leur premier site web, donc son évolution peut sembler plus brutale que pour d’autres langages
Beaucoup de gens ont tendance à avoir honte de PHP, mais ce n’est pas mon cas
Je ne connais pas très bien le langage, mais je sais qu’il existe beaucoup de projets impressionnants
Mon projet PHP préféré du moment est BookStack, que j’utilise comme wiki familial
Il existe encore beaucoup de sites construits sur des stacks PHP bien maintenues
J’ai utilisé du PHP en production entre 2021 et 2023, et le vrai problème n’était pas le langage lui-même, mais les vieilles bases de code et les bas salaires
Il y a énormément de code hérité de l’époque de PHP 4, et les schémas d’accès aux données varient tellement que la maintenance devient difficile
Mais en migrant vers PHP 8, la qualité du code s’est nettement améliorée
Je ne choisirais probablement pas PHP pour démarrer un nouveau projet, mais je participerais volontiers à un projet Laravel moderne
En revanche, comme les débutants pouvaient s’y mettre facilement sans notions de sécurité, il y a eu beaucoup de problèmes comme les injections SQL, ce qui lui a valu une réputation de langage « peu sûr »
Avec un framework comme Laravel, c’est un environnement bien plus stable et mature
C’est comme jouer de la guitare ou écrire de la poésie : tout le monde peut le faire, mais bien le faire est difficile
J’apprends en regardant directement le code, et j’aime auto-héberger un serveur radio/musique
PHP est devenu un langage de plus en plus complexe à mesure qu’il se met à jour
C’est toujours un langage centré sur le web, donc je me demande pourquoi il évolue autant
Au final, on dirait que les langages orientés objet traditionnels convergent vers une direction similaire
Même pour un langage destiné au web, il y a largement de quoi évoluer. Améliorer l’expérience développeur a toujours de la valeur
array_first(), array_last() sont utiles, mais l’opérateur pipe peut nuire à la maintenabilité
Comme il ne prend en charge que les fonctions unaires, il peut au contraire introduire des bugs dans les fonctions complexes
Dans l’annonce de PHP 8.5, ce qui m’a le plus intéressé, c’est la stabilité et la maturité du langage
Je suis surpris que PHP ajoute array_first, array_last et la stack trace des fatal errors avant même GTA6
Le fait que PHP continue d’ajouter de nouvelles fonctions et syntaxes augmente à long terme le coût de maintenance
Si l’on regarde les notes de version officielles, la valeur de certaines fonctionnalités reste discutable
parse_url()Notes de version officielles de PHP 8.5
Les exemples d’opérateur pipe omettent simplement l’usage classique des variables temporaires qu’on retrouve dans la plupart des langages
L’exemple de parsing d’URL n’était pas non plus comparé directement à
parse_url()parse_url()ne respecte pas totalement le standard et gère mal les URL relativesLa nouvelle fonction
uri()est plus propre, et si l’on ajoute la partial function application, les chaînes avec pipe deviendront plus lisiblesEn PHP CLI, j’avais l’habitude d’utiliser les **backticks (
)** pour appelershell_exec(), mais c’est maintenant deprecated J’utilisais souvent des choses commemkdir $dirname`Il y a un risque d’injection de métacaractères shell, donc il faut utiliser
mkdir()oupcntl_exec()de PHP