Fonction Fléchée
Les fonctions fléchées ont été introduites en PHP 7.4 en tant que syntaxe
plus concise pour les
fonctions anonymes.
Les fonctions anonymes comme les fonctions fléchées sont implémentées en
utilisant la classe
Closure.
Les fonctions fléchées ont la forme basique
fn (argument_list) => expr
.
Les fonctions fléchées supportent les mêmes fonctionnalités que les
fonctions anonymes,
à l'exception que l'utilisation des variables de la portée parente est
automatique.
Quand une variable utilisée dans l'expression est définie dans la portée
parente, elle sera implicitement capturée par valeur.
Dans l'exemple suivant, les fonctions $fn1 et
$fn2 se comportent de façon identique.
Exemple #1 Les fonctions fléchées capturent les variables par valeur automatiquement
<?php
$y = 1;
$fn1 = fn($x) => $x + $y;
// equivalent to using $y by value:
$fn2 = function ($x) use ($y) {
return $x + $y;
};
var_export($fn1(3));
?>
L'exemple ci-dessus va afficher :
Ceci fonctionne aussi si les fonctions fléchées sont imbriquées :
Exemple #2 Les fonctions fléchées capturent les variables par valeur automatiquement, même imbriquées
<?php
$z = 1;
$fn = fn($x) => fn($y) => $x * $y + $z;
// Outputs 51
var_export($fn(5)(10));
?>
Similairement aux fonctions anonymes,
la syntaxe des fonctions fléchées permet les signatures de fonction arbitraire,
ceci inclus les types de paramètres et de retour, valeur par défaut, variable,
aussi bien que le passage et retour par référence.
Tous les exemples suivants sont des fonctions fléchées valides :
Exemple #3 Exemples de fonctions fléchées
<?php
fn(array $x) => $x;
static fn($x): int => $x;
fn($x = 42) => $x;
fn(&$x) => $x;
fn&($x) => $x;
fn($x, ...$rest) => $rest;
?>
Les fonctions fléchées lie les variables par valeur.
Ceci est à peu près équivalent à effectuer un use($x)
pour
chaque variable $x utilisée à l'intérieur de la fonction
fléchée.
Un liage par valeur signifie qu'il n'est pas possible de modifier une
valeur de la portée extérieure.
Les fonctions anonymes
peuvent être utilisées à la place pour des liaisons par référence.
Exemple #4
Valeurs de la portée extérieure ne peuvent pas être modifiées par les fonctions fléchées
<?php
$x = 1;
$fn = fn() => $x++; // Has no effect
$fn();
var_export($x); // Outputs 1
?>