Image d'illustration -PHP 7.4 : Les fonctions fléchées aussi !

Pour rester dans la suite de mon précédent article sur les fonctions fléchées en ES6, PHP va également enfin avoir le support des fonctions fléchées ! Le vote de cette fonctionnalité a eu lieu le 2 mai 2019 et à ce jour, PHP 7.4, disponibles dans sa version beta1, dispose de cela. La RC est prévue pour la rentrée le 5 septembre et la version finale GA fin novembre de cette année 2019.

À quoi ressemblent elles et que sont les fonctions fléchées en PHP ?
Comme je l'ai dit dans mon précédent article, elles permettent une syntaxe plus courte et vous forcent à écrire un code avec potentiellement des fonctions en une ligne. Cela reste une déclaration classique mais est très utilisé, notamment pour les closures.

Avant les fonctions fléchées, les fonctions comme map, filter, reduce et plein d'autres recevant une fonction en paramètre, devaient être écrites comme ceci :

<?php

$items = [1, 2, 3];
$multiplier = 2;
$doubledItems = array_map(function ($item) use ($multiplier) {
  return $item * $multiplier;
}, $items);


Désormais, avec cette nouvelle syntaxe (sous réserve qu'elle ne change pas), ce code peut être écrit comme ceci :

<?php

$items = [1, 2, 3];
$multiplier = 2;
$doubledItems = array_map(fn($item) => $item * $multiplier, $items);


Une grande partie des bénéfices sont les mêmes que dans les autres langages (cf mon autre article wink) mais quelles sont les différences :

  1. Le code est plus lisible ;
  2. Le code est plus court, ce qui signifie moins de mots-clés standard inutile;
  3. La fonction fléchée capture les variables extérieures (elles sont liées "bindées") sans avoir à les définir explicitement à l'aide du mot-clé use. Augmentant encore une fois la lisibilité.


Mais il y a un truc... Avec les fonctions anonymes, lors de la liaison d'une variable (bind), vous pouvez modifier la valeur si la variable est liée à l'aide de & (passage en référence). Ce n'est pas possible, du moins pour l'instant, avec les fonctions fléchées. Regardez le code suivant :

<?php

// Fonction fléchée

$someValue = 1;
(fn() => ++$someValue)();
echo $someValue; // 1
$someValue = 1;

// Fonction standard correspondante

(function () use ($someValue) {
    return ++$someValue;
})();
echo $someValue; // 1

// Fonction standard avec passage en référence

$someValue = 1;
(function () use (&$someValue) {
    return ++$someValue;
})();
echo $someValue; // 2


À mon humble avis, c'est un avantage considérable pour le langage. On l'attendait depuis un moment ! Je n'ai pas encore testé la performance entre la nouvelle et l'ancienne syntaxe, mais je ne pense pas qu'elle soit très grande, voire même qu'il y en ait une.

Gardez toutefois deux choses à l'esprit :

La version 7.4 est normalement terminée car en bêta et la branche est publiée, mais on ne sait jamais...

Les variables liées (bindées) ne sont que des valeurs et ne peuvent être modifiées dans la fonction fléchée ; ce qui reste encore ouvert à la discussion et peut changer dans le futur.

Pour approfondir le sujet, consultez la RFC sur les fonctions fléchées :
https://wiki.php.net/rfc/arrow_functions_v2


2