fn
Le mot-clé "fn" introduit en PHP 7.4 permet de créer des fonctions fléchées, une notation abrégée pour les fonctions anonymes à expression unique.
Le mot-clé PHP fn (fonctions fléchées)
Le mot-clé fn, introduit dans PHP 7.4, crée des fonctions fléchées — une syntaxe concise pour écrire des fonctions anonymes à expression unique. Une fonction fléchée retourne la valeur d'une seule expression et capture automatiquement les variables qu'elle utilise depuis la portée environnante. Cela la rend idéale pour les courts rappels passés aux fonctions de tableau comme array_map, array_filter et array_reduce.
Cette page couvre la syntaxe, la façon dont la capture de variables diffère des fermetures classiques, les principales règles et pièges, ainsi que des exemples pratiques.
Syntaxe
Une fonction fléchée utilise fn, une liste de paramètres, l'opérateur => (fat arrow), et une expression unique dont la valeur est retournée implicitement :
$arrowFunction = fn($parameter) => expression;Il n'y a pas de corps { ... } ni d'instruction return — les deux sont interdits. L'expression après => est la valeur de retour.
$square = fn($n) => $n * $n;
echo $square(4); // 16Capture automatique des variables (pas de use nécessaire)
La plus grande différence par rapport à une fermeture classique (function () use (...) { ... }) est qu'une fonction fléchée capture automatiquement par valeur chaque variable de la portée parente qu'elle référence. Vous n'écrivez jamais de clause use :
Comme la capture est par valeur uniquement, les fonctions fléchées ne peuvent pas modifier une variable externe par référence. Si vous en avez besoin, utilisez plutôt une fermeture complète avec use (&$var).
Exemples
Les fonctions fléchées excellent en tant que rappels d'une ligne. L'expression est retournée automatiquement, donc aucun return n'est nécessaire.
<?php
// array_reduce — sum a list
$numbers = [1, 2, 3, 4, 5];
$sum = array_reduce($numbers, fn($carry, $number) => $carry + $number);
echo $sum . PHP_EOL; // 15
// array_filter — keep names longer than 4 characters
$names = ["John", "Maryjane", "Paul", "Jane"];
$filtered = array_filter($names, fn($name) => strlen($name) > 4);
print_r($filtered); // Array ( [1] => Maryjane )
// array_map — apply 20% tax to each price
$prices = [10, 20, 30];
$withTax = array_map(fn($p) => $p * 1.2, $prices);
print_r($withTax); // Array ( [0] => 12 [1] => 24 [2] => 36 )
// Nested arrow functions (currying) — each captures from its parent
$adder = fn($x) => fn($y) => $x + $y;
echo $adder(3)(4) . PHP_EOL; // 7Pour en savoir plus sur le passage de fonctions comme rappels, consultez les fonctions de rappel PHP.
Règles et pièges
- Une seule expression. Les fonctions fléchées ne peuvent pas contenir d'instructions, de boucles ou de plusieurs lignes. Si votre logique nécessite un bloc, utilisez une fermeture complète avec
function () use (...) { ... }. - La capture est par valeur. Modifier une variable capturée à l'intérieur de la fonction fléchée n'affecte pas la variable externe, et les modifications ultérieures de la variable externe ne sont pas visibles.
- Pas de capture par référence. Vous ne pouvez pas utiliser
use (&$var); utilisez une fermeture complète lorsque vous avez besoin de modifier un état externe. - Les annotations de type et les valeurs par défaut sont autorisées :
fn(int $n = 0): int => $n + 1. - PHP 7.4+ uniquement. Sur les versions plus anciennes, revenez à
function () use (...) { ... }.
fn vs. function (fermetures)
Fonction fléchée (fn) | Fermeture (function) | |
|---|---|---|
| Capture de variables | Automatique, par valeur | Explicite via use |
| Corps | Expression unique | Bloc d'instructions complet |
Mot-clé return | Implicite | Obligatoire |
| Capture par référence | Non | Oui, avec use (&$var) |
| Disponible depuis | PHP 7.4 | PHP 5.3 |
Optez pour fn lorsque vous avez un court rappel à expression unique. Utilisez une fermeture complète lorsque vous avez besoin de plusieurs instructions, d'une capture par référence, ou que vous souhaitez être explicite sur ce que vous capturez.
Voir aussi : Fonctions PHP · portée des variables.