Menu

Fonctions fléchées PHP : syntaxe fn() => et exemples

Une fonction fléchée est une fonction anonyme d'une seule expression, écrite fn($x) => $x * 2. Elle utilise automatiquement les variables extérieures, par valeur, sans use. La syntaxe, le fonctionnement de la capture, les types, les callbacks pour array_map et usort, et quand utiliser plutôt une closure complète.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

Une fonction fléchée est une fonction anonyme courte : fn($x) => $x * 2. Le corps après => est une seule expression dont la valeur est renvoyée, et toute variable du code environnant utilisée par l'expression est capturée automatiquement, par valeur. Les fonctions fléchées existent depuis PHP 7.4 et servent surtout de callbacks.

La syntaxe

fn, la liste de paramètres, =>, une expression. Les types de paramètres, les valeurs par défaut et le type de retour fonctionnent comme dans les fonctions normales :

Il n'y a ni mot-clé return ni accolades. Une longue expression peut quand même être répartie sur plusieurs lignes pour la lisibilité.

Les variables extérieures sont capturées par valeur

Une fonction fléchée voit toutes les variables de la portée où elle est créée. Elle copie leurs valeurs à ce moment-là. Les modifications faites à l'intérieur restent à l'intérieur, et celles faites à l'extérieur après la création de la fonction ne sont pas vues :

C'est la principale différence avec function () use (&$count), qui peut partager une variable par référence. Une fonction fléchée ne peut pas réaffecter une variable extérieure. Elle peut quand même modifier un objet qu'elle a capturé (la copie est une poignée vers le même objet), et un paramètre déclaré par référence fonctionne comme dans toute fonction : fn(array &$list) => $list[] = 'x'.

Callbacks pour array_map, array_filter et usort

La plupart des fonctions de tableau prennent un callback, et c'est là que les fonctions fléchées allègent le plus le code. Comparez un même filtre écrit des deux façons :

<=> renvoie -1, 0 ou 1, exactement ce qu'attend usort(), donc trier par un champ tient sur une ligne. Échangez $a et $b pour trier dans l'ordre décroissant.

Des fonctions fléchées qui renvoient des fonctions fléchées

Les variables capturées incluent les paramètres d'une fonction fléchée englobante, vous pouvez donc les imbriquer pour construire des fonctions à partir d'autres valeurs :

Remarquez qu'array_filter() garde les clés d'origine, c'est pourquoi le résultat commence à l'index 1.

fn ou function : quand il faut une closure complète

Les fonctions fléchées ne suffisent plus quand le corps a besoin de plus d'une expression ou doit modifier une variable extérieure. Utilisez alors une fonction anonyme :

fn($x) => ...function ($x) use ($y) { ... }
Corpsune expressionn'importe quelles instructions
Retourautomatiquereturn explicite
Variables extérieurestoutes celles utilisées, automatiquementseulement celles listées dans use
Capture par référencenonoui, use (&$y)
Disponible depuisPHP 7.4PHP 5.3

Quand une fonction fléchée semble à l'étroit, c'est souvent que le travail en contient deux. Le séparer en un filtre et une somme, comme ci-dessus, garde chaque callback à une seule expression.

Questions fréquentes

Qu'est-ce qu'une fonction fléchée en PHP ?

Une fonction anonyme courte introduite en PHP 7.4 : fn($x) => $x * 2. Son corps est une seule expression dont la valeur est renvoyée automatiquement, et elle peut lire les variables de la portée englobante sans clause use.

Une fonction fléchée PHP peut-elle avoir plusieurs lignes ?

Non. Le corps après => doit être une seule expression ; il n'y a pas de bloc d'instructions. Vous pouvez répartir une longue expression sur plusieurs lignes, mais s'il vous faut des if, des boucles ou plusieurs instructions, utilisez plutôt function () use (...) { ... }.

Une fonction fléchée peut-elle modifier une variable extérieure ?

Non. Les fonctions fléchées capturent les variables extérieures par valeur, donc fn() => $count++ ne modifie que sa propre copie et $count à l'extérieur reste inchangée. Pour modifier une variable extérieure, utilisez une closure avec use (&$count).

Quelle est la différence entre fn et function en PHP ?

fn($x) => ... contient une seule expression, la renvoie implicitement et capture par valeur chaque variable extérieure qu'elle utilise. function ($x) use ($y) { ... } peut contenir n'importe quelles instructions, demande un return explicite et ne voit que les variables listées dans use, qui peuvent être capturées par référence.

Illustration des langages de programmation de Coddy

Apprendre à coder avec Coddy

COMMENCER