PHP 8.5 et son opérateur pipe |> : pipelines lisibles sans casse-tête
Le 26 septembre 2025, note la date : PHP 8.5 débarque enfin, et tu vas devoir t'y faire. Parmi les nouveautés, l'opérateur pipe |> te force à abandonner les parenthèses imbriquées façon matriochka. À la place, tu obtiens des pipelines lisibles, enfin dignes d'un langage qui prétend être moderne.
Dans cet article, tu vas décortiquer l'opérateur, jauger ses limites et surtout piquer des cas d'usage concrets pour le balancer en production sans faire semblant d'avoir peur.
Pourquoi un pipe en PHP ?
Dans quasiment toutes tes applis, tu enchaînes des transformations : nettoyer une entrée utilisateur, valider un payload, instancier un objet, sérialiser une réponse, etc. Jusqu'ici, tu avais deux options :
- enchaîner des appels imbriqués (
foo(bar(baz($input)))) en espérant que ton collègue du lundi matin comprenne l'ordre d'exécution ; - multiplier les variables temporaires (
$step1,$step2,$step3) pour étaler la logique au prix d'un bruit visuel digne d'une fanfare municipale.
Le pipe |> t'offre un troisième chemin : il transmet automatiquement la valeur de gauche en argument implicite de l'expression de droite. Résultat : un code que tu lis de haut en bas, beaucoup plus proche de la manière dont tu raisonnes vraiment.
Syntaxe : le point à retenir
La règle est simple : la valeur à gauche est injectée en premier paramètre de l'expression de droite. Pour utiliser l'opérateur, ajoute ... là où tu veux que la valeur atterrisse si la fonction exige un autre ordre d'arguments. Pas besoin d'incantation vaudoue, juste trois petits points.
php
Ici, trim reçoit $donnees, puis le résultat part chez htmlspecialchars, puis finit chez mb_strtoupper. Pas besoin d'accolades supplémentaires ni de variables intermédiaires qui polluent ton écran pour rien.
ℹ️ Quand l'expression cible accepte plusieurs arguments,
...indique l'endroit exact où injecter la valeur courante. Si tu l'oublies, PHP la place au premier paramètre et tu seras bon pour déboguer un comportement « inattendu ».
Cas pratique n°1 : valider l'entrée d'un formulaire
Prends une API qui reçoit un titre d'article. Tu veux :
- retirer les espaces parasites ;
- limiter à 80 caractères ;
- s'assurer que le champ n'est pas vide ;
- retourner une erreur claire si ça dérape.
php
Dans ce pipeline, chaque étape reste isolée, testable et simple à relire. Les fonctions anonymes servent de garde-fous sans qu'on te force à sortir une classe dédiée juste pour rassurer un architecte anxieux.
Cas pratique n°2 : formatage d'une réponse HTTP
Imagine ton micro-service météo qui renvoie une réponse JSON. Le pipe te permet de composer la transformation en séparant chaque intention, histoire de ne pas te perdre dans les embranchements :
php
Là encore, tu lis le flux comme une suite de transformations pures. Tu peux même glisser un log ou une métrique en ajoutant une lambda au milieu du pipeline, juste pour prouver que tu surveilles encore ce qui se passe.
Cas pratique n°3 : hydrater un objet métier
Les pipelines fonctionnent aussi avec les méthodes statiques ou d'instance tant que la signature accepte la valeur en premier argument. Exemple avec un Value Object EmailAddress, parfait pour vérifier que ton utilisateur n'a pas tapé son mail avec les coudes :
php
En plaçant ... dans EmailAddress::fromString(...), tu indiques où injecter la valeur courante. Tu peux ensuite chaîner avec un constructeur d'agrégat ou une commande CQRS pour aller jusqu'à la persistance, sans transformer ton code en spaghetti.
Bonnes pratiques pour adopter le pipe sereinement
- Vise la cohérence : tout pipeline devrait raconter une seule histoire. S'il mixe validation, persistance et rendu, scie-le en plusieurs fonctions avant que quelqu'un ne te le reproche en review.
- Nomme ou commente quand c'est utile : une lambda
fn($x) => $xn'apporte rien ; préfère une fonction nommée commesanitizeTitlesi l'intention n'est pas évidente. - Soigne la lisibilité verticale : aligne les pipes, laisse un espace entre les blocs logiques, ajoute des commentaires courts si besoin. Ce n'est pas du graffiti, mais presque.
- Pense testabilité : extraire des fonctions pures (ex.
limitLength) te permet de les tester séparément, le pipe ne devenant qu'une orchestration. - Respecte le typage : les étapes doivent accepter et renvoyer le même type attendu par l'étape suivante. Les
union typesetreadonly classesrécents complètent bien ce style fonctionnel, à condition que tu les utilises pour autre chose qu'impressionner LinkedIn.
Quand éviter l'opérateur pipe ?
Même si l'opérateur est séduisant, il n'est pas universel :
- Transformations avec effets de bord (envoi d'e-mails, requêtes HTTP, écriture disque) : ça brouille le flux et ça flingue la lisibilité. Emballe-les dans une méthode explicite et appelle-la à la fin du pipeline, histoire d'assumer tes effets secondaires.
- APIs qui attendent la valeur en second argument : tu devras ajouter
...pour repositionner la valeur, et la lecture s'alourdit. Dans ce cas, un helper dédié t'évitera de faire croire que tout va bien alors que non. - Boucles complexes : si ton pipeline contient plus de trois lambdas mutantes, respire, découpe, ou reviens à une construction plus impérative. Le but n'est pas de décrocher le prix du pipeline le plus indigeste.
Intégrer le pipe dans une base existante
- Cartographie : repère les endroits où tu empiles les
array_map/array_filter, les validations de formulaire ou les transformations de réponses API. - Refactoring progressif : remplace les blocs imbriqués par des pipelines courts. Ajoute des tests de non-régression si tu ne veux pas passer tes nuits en astreinte.
- Partage de conventions : grave dans ton guide interne quand utiliser le pipe, comment nommer les helpers et comment gérer les exceptions.
- Outillage : mets à jour tes snippets d'IDE et tes linters pour accepter la nouvelle syntaxe (
php-cs-fixer,Psalm,PHPStan). Sinon tu vas râler sur des warnings inutiles pendant des semaines. - Formation : organise une revue de code dédiée ou une session live coding pour montrer les gains de lisibilité à l'équipe, même à ceux qui jurent encore par PHP 5.
Résumé express
- Le pipe
|>de PHP 8.5 envoie la valeur de gauche dans l'expression de droite sans variable temporaire. - Ajoute
...pour placer la valeur exactement où tu veux dans la signature cible, sinon tu vas maudire PHP alors que c'est juste toi. - Des pipelines courts et homogènes gagnent en lisibilité, testabilité et expressivité.
- Limite l'opérateur aux transformations pures ou quasi-pures ; encapsule les effets de bord, même si tu préfères les ignorer.
- Prépare ton écosystème (linters, standards, formation) pour tirer parti de cette nouveauté sans casser le reste du projet.
L'opérateur pipe ne transforme pas PHP en langage purement fonctionnel, mais il t'offre un outil puissant pour écrire du code moderne et expressif. À toi de jouer pour rendre tes chaînes de transformation aussi claires que tes idées, ou au moins moins floues que d'habitude.