Les fermetures courtes, également connues sous le nom de fonctions fléchées, sont une manière d'écrire des fonctions courtes en PHP. Cette notation est utile lors du passage de fermetures à des fonctions telles que array_map ou array_filter.
Ils ressemblent à ceci :
// A collection of Post objects $posts = [/* … */]; $ids = array_map(fn($post) => $post->id, $posts);
Avant cela, il fallait écrire comme ceci :
$ids = array_map(function ($post) { return $post->id; }, $posts);
Résumons comment utiliser les fermetures courtes.
● Disponible depuis PHP 7.4
● Ils commencent par le mot clé fn
● Ils ne peuvent avoir qu'une seule expression, l'instruction return
● L'instruction return le mot clé n'est pas autorisé
● Les types de paramètres et de retour peuvent être indiqués
Une manière plus strictement typée d'écrire l'exemple ci-dessus pourrait être :
$ids = array_map(fn(Post $post): int => $post->id, $posts);
Deux autres choses à mention :
● L'opérateur spread est autorisé
● Les références sont autorisées, les deux paramètres peuvent être utilisés comme valeurs de retour
Si vous souhaitez renvoyer une valeur par référence , vous devez utiliser la syntaxe suivante :
fn&($x) => $x
Bref, une fermeture courte a la même fonctionnalité qu'une fermeture normale, sauf qu'elle n'autorise qu'une seule expression.
#Pas de lignes multiples
Vous avez bien lu : une fermeture courte ne peut avoir qu'une seule expression. Cela signifie que vous ne pouvez pas inclure plusieurs lignes.
La raison est la suivante :
Le but des fermetures courtes est de réduire la verbosité. fn est bien sûr plus court que function dans tous les cas. Cependant, le créateur du RFC, Nikita Popov, estime que si vous utilisez des fonctions multilignes, vous gagnerez moins à utiliser des fermetures courtes.
Après tout, les fermetures sur plusieurs lignes sont déjà plus verbeuses par définition, donc pouvoir ignorer deux mots-clés (fonction et retour) ne fera pas beaucoup de différence ;
Que vous soyez d'accord ou non avec ce point de vue, cela dépend de vous. Bien que je puisse penser à de nombreuses fermetures sur une seule ligne dans mes projets, il existe également de nombreuses fermetures sur plusieurs lignes, et dans ces cas, la syntaxe courte me manque personnellement.
Il y a cependant de l'espoir : il sera peut-être possible d'ajouter de courtes fermetures multilignes à l'avenir, mais ce n'est qu'une RFC.
# Valeur de la portée externe
Une autre différence significative entre les fermetures courtes et les fermetures normales est que les fermetures courtes ne nécessitent pas le mot-clé use pour pouvoir récupérer de la portée externe accéder aux données.
$modifier = 5; array_map(fn($x) => $x * $modifier, $numbers);
Il convient de noter que les variables de la portée externe ne peuvent pas être modifiées. Les valeurs sont liées à une valeur et non à une référence. Cela signifie que vous pouvez modifier $modifier dans une courte période de fermeture, même si cela n'affectera pas la variable $modifier dans la portée externe.
La seule exception bien sûr est le mot-clé $this, qui fonctionne exactement comme une fermeture normale :
array_map(fn($x) => $x * $this->modifier, $numbers);
# possibilités futures
Je l'ai déjà mentionné fermetures courtes multilignes, cela reste une possibilité à l'avenir.
Une autre idée est d'autoriser une syntaxe de fermeture courte dans les classes, telles que les getters et les setters :
class Post { private $title; fn getTitle() => $this->title; }
Dans l'ensemble, les fermetures courtes sont une fonctionnalité bienvenue, bien qu'il y ait encore place à l'amélioration. Le plus important est probablement les fermetures courtes multilignes
Traduction : https://stitcher.io/blog/short-closures-in-php
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!