PHP 8.5 est arrivé : il est temps de le tester @php[architect]
Volume 24 - Numéro 11 (11/2025) by Christopher Miller
PHP 8.5 est sorti le 20 novembre, et si vous êtes comme moi, vous surveillez ces versions candidates depuis des semaines, en vous demandant quand vous pourrez enfin tester correctement cette nouvelle version. Eh bien, l'attente est terminée. Il est temps de mettre en place un environnement de test et de voir ce qui suscite tant d'engouement
Avant d'entrer dans le vif du sujet, permettez-moi d'être très clair sur un point : n'installez pas encore cette version en production. Peu importe la stabilité apparente de ces versions RC ou votre niveau de confiance. Attendez au moins la version 8.5.1. Faites-moi confiance, j'ai suffisamment d'expérience pour savoir que la première version corrigée vaut toujours la peine d'attendre. Profitez de ce temps pour tester, explorer et, surtout, déterminer quelles dépréciations vont vous poser problème lorsque vous finirez par franchir le pas.
Mettre les mains dans le cambouis
La manière la plus simple de tester PHP 8.5 est d'utiliser Docker. Les images officielles sont déjà disponibles et vous pouvez disposer d'un environnement de travail en quelques secondes :
docker run -it --rm php:8.5-cli php -v
Vous pouvez maintenant exécuter votre code avec docker compose run php85 php votre-script.php et voir ce qui ne fonctionne pas. Et croyez-moi, quelque chose va ne pas fonctionner, c'est justement le but de cet exercice. Si vous êtes du genre à aimer compiler à partir du code source (je pense notamment aux utilisateurs d'Arch), rendez-vous sur php.net/downloads1 et récupérez l'archive source. La procédure habituelle s'applique : ./configure, make, make install. Vous connaissez la chanson.
Quoi de neuf et pourquoi vous devriez vous y intéresser
Parlons des principales fonctionnalités, car PHP 8.5 apporte des nouveautés vraiment intéressantes.
L'opérateur pipe est probablement le plus important ici. Si vous avez envieux des langages de programmation fonctionnels et de leurs
pipelines de données propres, eh bien, Noël est arrivé en avance. Au lieu d'imbriquer des appels de fonction ou de créer un tas de variables temporaires,
vous pouvez désormais faire ceci :
Cela se lit de gauche à droite, transmet la valeur à chaque fonction et permet de garder votre code lisible. Le hic ? Chaque fonction appelable
doit accepter exactement un paramètre obligatoire, et celui-ci doit être le premier paramètre. Les paramètres par référence ne sont pas non plus autorisés.
Mais dans la plupart des cas, cela permettra de nettoyer considérablement votre code.
Nous obtenons également array_first() [Renvoie la première valeur d'un tableau] et array_last() [Renvoie la dernière valeur d'un tableau] — enfin.
Oui, tout le monde avait sa propre implémentation de ces fonctions depuis des années, mais les intégrer au cœur signifie une chose de moins à polyfiller.
Elles sont simples, fonctionnent avec des tableaux associatifs et renvoient null pour les tableaux vides au lieu de générer des erreurs — exactement ce à quoi vous vous attendez, et exactement ce dont nous avons besoin.
La nouvelle extension URI est très importante si vous travaillez avec des URL. La fonction parse_url() de PHP montre ses limites depuis des années,
et nous disposons désormais d'un analyseur syntaxique conforme aux normes qui respecte réellement la norme RFC 3986. Il était temps.
Les erreurs fatales sont désormais accompagnées de traces de pile par défaut. Cela change la donne en matière de débogage. Au lieu d'un message « Temps d'exécution maximal dépassé » sans contexte,
vous verrez où vous vous trouviez dans la pile d'appels lorsque les choses ont mal tourné. Définissez fatal_error_backtraces=1 dans votre fichier php.ini (bien que cette option soit activée par défaut dans la version 8.5) et constatez une réduction considérable de votre temps de débogage.
La danse de la dépréciation
C'est là que les choses deviennent intéressantes. Chaque nouvelle version apporte son lot de dépréciations, et la version 8.5 ne fait pas exception. Voici vos avertissements
: corrigez-les dès maintenant, ou vous devrez faire face à des erreurs fatales dans PHP 9.0. L'opérateur backtick est déprécié. Si vous avez utilisé des backticks
pour l'exécution de shell – et soyons honnêtes, nous l'avons tous fait dans des scripts rapides – il est temps de passer à shell_exec(). La migration est simple :
PHP-CS-Fixer peut gérer cela automatiquement grâce à la règle backtick_to_shell_exec. Lancez-la dès maintenant, vous me remercierez plus tard.
Les transtypages non canoniques sont supprimés. Si vous utilisiez (integer), (double), (boolean) ou (binary), passez aux noms standard : (int), (float), (bool). Il s'agit d'une recherche et d'un remplacement en une seule ligne dans l'ensemble de votre base de code, mais vous devez le faire.
Les constantes MHASH sont obsolètes. Si vous les utilisez encore, tout d'abord, pourquoi ? Ensuite, migrez vers les fonctions de hachage appropriées. L'extension MHASH est obsolète depuis des années (PHP 5.3), cela ne fait que le rendre officiel.
Les points-virgules après les instructions case sont désormais obsolètes. Il s'agit d'un vestige de PHP/FI 2 – oui, aussi ancien que cela – et presque personne ne sait qu'il existe. Mais si vous avez un code comme celui-ci :
Remplacez ces points-virgules par des deux-points. Encore une fois, PHP-CS-Fixer vous aide grâce à la règle switch_case_semicolon_to_colon.
Un ensemble de fonctions reflection et de gestion des ressources sont également en passe d'être dépréciées : setAccessible(), curl_close(), imagedestroy(), et d'autres.
Il s'agit principalement d'alias ou de fonctions inutiles qui auraient dû être supprimées il y a des années. Consultez la liste complète des dépréciations RFC et rechercher dans votre base de code.
Tester correctement votre code
Voici votre plan d'action. Tout d'abord, activez tous les rapports d'erreurs dans votre environnement de test :
error_reporting(E_ALL);
ini_set('display_errors', '1');
Utilisez des outils d'analyse statique. PHPStan et Psalm sont déjà mis à jour pour PHP 8.5. Ils détecteront les erreurs que vos tests ne détectent pas. Exécutez-les à leur niveau le plus strict et voyez ce qui ressort.
vendor/bin/phpstan analyse --level=max src/
Ce que vous devriez réellement faire dès maintenant
N'attendez pas d'être prêt à mettre à niveau votre production. Commencez dès maintenant. Créez une branche de développement, lancez un conteneur PHP 8.5 et exécutez votre application. Corrigez les dépréciations au fur et à mesure que vous les trouvez. Ces modifications sont rétrocompatibles avec PHP 8.4, vous pouvez donc les déployer immédiatement.
Documentez vos découvertes. Conservez une liste des dépréciations qui affectent votre base de code et des corrections que vous avez appliquées. Lorsque le moment sera venu de procéder à la mise à niveau, vous vous en féliciterez.
Testez également vos dépendances. Certains de vos paquets Composer ne sont peut-être pas encore compatibles avec PHP 8.5. Signalez les problèmes, soumettez des PR si vous le pouvez, ou au moins sachez à quoi vous vous exposez.
Conclusion
PHP 8.5 est une version solide. Les nouvelles fonctionnalités sont vraiment utiles, il ne s'agit pas seulement d'améliorations théoriques. L'opérateur pipe à lui seul vaut la mise à niveau pour la lisibilité du code. Les dépréciations sont raisonnables : elles consistent principalement à nettoyer les anciens résidus et à inciter les utilisateurs à adopter de meilleures pratiques. Testez-la correctement.
Cassez des choses en développement pour qu'elles ne cassent pas en production. Corrigez ces dépréciations maintenant, pendant que vous avez le temps d'y réfléchir, et non lorsque vous serez pressé par la date limite de PHP 9.0
Et n'oubliez pas : il s'agit d'une version mineure, et non d'une mise à jour majeure. La mise à niveau devrait être relativement simple si vous restez au courant des dépréciations. Mais « devrait être » et « est » sont deux choses différentes, c'est pourquoi vous devez effectuer des tests dès maintenant.
Maintenant, allez-y et cassez quelque chose, de préférence dans Docker.