La fondation PHP a annoncé que PHP 8.5, dont la sortie est prévue en novembre 2025, apportera une autre fonctionnalité très attendue : l'opérateur pipe (|>). Il s'agit d'une petite fonctionnalité au potentiel énorme, mais qui a tout de même pris des années à voir le jour.PHP est un langage de script polyvalent destiné au développement web. Le code PHP est généralement traité sur un serveur web par un interpréteur PHP implémenté sous forme de module, de démon ou d'exécutable CGI (Common Gateway Interface). Sur un serveur web, le résultat du code PHP interprété et exécuté, qui peut être n'importe quel type de données, telles que du code HTML généré ou des données d'image binaires, forme tout ou partie d'une réponse HTTP.
Il existe divers systèmes de modèles web, systèmes de gestion de contenu web et frameworks web qui peuvent être utilisés pour orchestrer ou faciliter la génération de cette réponse. En outre, PHP peut être utilisé pour de nombreuses tâches de programmation en dehors du contexte web, telles que les applications graphiques autonomes et le contrôle de drones. Le code PHP peut également être exécuté directement à partir de la ligne de commande.
Selon un rapport, en octobre 2024 (environ deux ans après l'arrêt de PHP 7 et 11 mois après la sortie de PHP 8.3), PHP 7 est toujours utilisé par 50,0 % des sites web PHP, ce qui est obsolète et connu pour être peu sûr. En outre, 13,2 % des sites web PHP utilisent PHP 5, encore plus obsolète (discontinué depuis plus de 5 ans) et peu sûr, et PHP 8.0, qui n'est plus pris en charge, est également très populaire, de sorte que la majorité des sites web PHP n'utilisent pas de versions prises en charge.
La fondation PHP a annoncé que PHP 8.5, dont la sortie est prévue en novembre 2025, apportera une autre fonctionnalité très attendue : l'opérateur pipe (|>). Il s'agit d'une petite fonctionnalité au potentiel énorme, mais qui a tout de même pris des années à voir le jour.
Qu'est-ce qu'un opérateur pipe ?
L'opérateur pipe, écrit |>, est d'une simplicité trompeuse. Il prend la valeur située à sa gauche et la transmet comme argument unique à une fonction (ou, dans le cas de PHP, callable) située à sa droite :
| Code PHP : | Sélectionner tout |
1 2 3 4 | $result = "Hello World" |> strlen(...) // Is equivalent to $result = strlen("Hello World"); |
En soi, cela n'a rien de très intéressant. Ce qui est intéressant, c'est lorsqu'il est répété ou enchaîné pour former un « pipeline ». Voici par exemple du code réel issu d'un projet réel, refondu pour utiliser des pipes :
| Code PHP : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | $arr = [ new Widget(tags: ['a', 'b', 'c']), new Widget(tags: ['c', 'd', 'e']), new Widget(tags: ['x', 'y', 'a']), ]; $result = $arr |> fn($x) => array_column($x, 'tags') // Gets an array of arrays |> fn($x) => array_merge(...$x) // Flatten into one big array |> array_unique(...) // Remove duplicates |> array_values(...) // Reindex the array. ; // $result is ['a', 'b', 'c', 'd', 'e', 'x', 'y'] |
Le même code sans pipes nécessiterait soit cette horrible imbrication :
| Code PHP : | Sélectionner tout |
array_values(array_unique(array_merge(...array_column($arr, 'tags'))));
Ou de créer manuellement une variable temporaire pour chaque étape. Bien que les variables temporaires ne soient pas la pire chose au monde, elles représentent une charge mentale supplémentaire et signifient qu'une chaîne comme celle-ci ne peut pas être utilisée dans un contexte à expression unique, comme un bloc match(). Une chaîne de pipes le peut.
Quiconque a déjà travaillé sur la ligne de commande Unix/Linux reconnaîtra probablement la similitude avec le pipe du shell, |. C'est tout à fait délibéré, car il s'agit en fait de la même chose : utiliser la sortie du côté gauche comme entrée du côté droit.
D'où cela vient-il ?
L'opérateur |> apparaît dans de nombreux langages, principalement dans le monde fonctionnel. F# dispose essentiellement du même opérateur, tout comme OCaml. Elixir propose une version légèrement plus sophistiquée. Il existe de nombreuses bibliothèques PHP qui offrent des fonctionnalités similaires avec de nombreuses étapes supplémentaires coûteuses, y compris la bibliothèque Crell/fp.
L'histoire des pipes PHP commence cependant avec Hack/HHVM, le fork PHP de Facebook, anciennement une implémentation concurrente. Hack incluait de nombreuses fonctionnalités qui allaient au-delà de ce qu'offrait PHP 5 à l'époque ; beaucoup d'entre elles ont finalement été intégrées dans les versions ultérieures de PHP. L'une de ses fonctionnalités était une version unique de l'opérateur pipe.
En 2016, Sara Golemon, contributrice de longue date à PHP et ancienne responsable Open Source du projet HHVM, a proposé de porter directement les pipes de Hack vers PHP. Dans cette RFC, le côté droit d'un pipe n'était pas une fonction callable, mais une expression, et utilisait un jeton magique $$ (affectueusement appelé T_BLING, du moins selon votre serviteur) pour y injecter le résultat du côté gauche. Dans ce cas, l'exemple ci-dessus ressemblerait à ceci :
| Code PHP : | Sélectionner tout |
1 2 3 4 5 6 | $result = $arr |> array_column($$, 'tags') |> array_merge(...$$) |> array_unique($$) |> array_values($$) ; |
Bien que puissant, ce système était également quelque peu limitatif. Il était très atypique, contrairement à tous les autres langages. Cela impliquait également une syntaxe étrange et unique pour les fonctions à appel partiel qui ne fonctionnait qu'en association avec des pipes.
Cette RFC n'a pas été soumise au vote. Il...
La fin de cet article est réservée aux abonnés. Soutenez le Club Developpez.com en prenant un abonnement pour que nous puissions continuer à vous proposer des publications.