2 points par GN⁺ 2025-11-21 | 1 commentaires | Partager sur WhatsApp
  • 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 forme clone($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
  • 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 static et ne peuvent pas accéder à des variables externes
  • 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() et array_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() et array_key_last()
  • Ajout d’un nouveau parseur d’URI

    • La classe Uri\Rfc3986\Uri fournit des méthodes comme getHost(), getScheme(), getPort(), etc.
    • Cela simplifie la manipulation et l’analyse des URI

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é

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_FAILURE lors 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

 
GN⁺ 2025-11-21
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

    • Je pense que PHP est un exemple représentatif de transition à grande échelle réussie
      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
    • Beaucoup disent que PHP est devenu complexe, mais du code simple que j’ai écrit en 5.3 fonctionne toujours parfaitement en PHP 8
      On peut écrire de manière compliquée, mais ce n’est pas une obligation
    • Je me demande si ce logiciel de chiffrement était Zend
      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
    • PHP 8 reste assez facile à comprendre si on l’apprend correctement dès le départ
      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

    • Je pense que le PHP moderne reste un langage très lisible
      J’ai fait du C++ pendant 10 ans, mais aujourd’hui PHP est bien plus facile à lire que du code C++ moderne
    • Apprendre PHP 8 suffit. Le PHP actuel est bien meilleur qu’avant
    • La plupart des logiciels connaissent un problème similaire de nos jours
      On a l’impression que l’objectif de simplicité a disparu, et qu’on ne fait qu’empiler des fonctionnalités
    • En réalité, c’est pareil dans les autres langages
      Le web évolue particulièrement vite, donc si on ne suit pas, on se fait dépasser
    • Je travaille comme expert Java et je dois souvent expliquer les nouvelles fonctionnalités à mes collègues
      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

    • Le PHP moderne est un langage rapide et excellent
      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
    • PHP était un langage intuitif et agréable à utiliser
      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 »
    • Je préfère un backend PHP à JS/TS + framework moderne
      Avec un framework comme Laravel, c’est un environnement bien plus stable et mature
    • J’ai construit ma carrière avec PHP, et j’apprécie toujours son processus de modernisation
      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’aime AzuraCast
      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

    • C# et Java sont eux aussi centrés sur les backends web et sont devenus plus complexes
      Au final, on dirait que les langages orientés objet traditionnels convergent vers une direction similaire
    • Le web lui-même n’a plus grand-chose de simple
    • Il existe aussi des projets comme NativePhp
      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
    • J’ai d’abord critiqué sans lire l’article, mais en y revenant, certaines fonctionnalités sont pas mal
      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

    • Ce sont de bons ajouts, mais array_shift ou array_pop suffisaient déjà dans les faits
  • 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

    • L’extension URI est plus rapide, mais fait doublon avec parse_url()
    • L’opérateur pipe relève surtout des préférences personnelles, et peut nuire à la cohérence du style de code
    • L’amélioration de clone est minime
    • #Discard/void remplace en pratique des fonctions déjà assurées par les analyseurs statiques
    • Les closures dans les constantes sont intéressantes, mais pourraient mener à des attributs (#attribute) trop complexes
    • Les handles cURL persistants sont un véritable gain de performances
    • array_first() n’est guère plus qu’un sucre syntaxique, et sera probablement peu utilisé dans les grands projets
  • 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 relatives
      La nouvelle fonction uri() est plus propre, et si l’on ajoute la partial function application, les chaînes avec pipe deviendront plus lisibles
  • En PHP CLI, j’avais l’habitude d’utiliser les **backticks ()** pour appeler shell_exec(), mais c’est maintenant deprecated J’utilisais souvent des choses comme mkdir $dirname`

    • C’est un anti-pattern de sécurité
      Il y a un risque d’injection de métacaractères shell, donc il faut utiliser mkdir() ou pcntl_exec() de PHP