Fonctions fléchées en PHP 7.4


Les fonctions fléchées, également appelées fermetures courtes , sont un bon moyen d'écrire du code propre en PHP. Cette forme d'écriture sera utile lors du passage de fermetures à des fonctions comme array_map ou array_filter .


Un exemple:


 //   Post $posts = [/* … */]; $ids = array_map(fn($post) => $post->id, $posts); 

Il était écrit comme ceci:


 $ids = array_map(function ($post) { return $post->id; }, $posts); 

En bref:


  • Disponible depuis PHP 7.4
  • Commencez par le mot-clé fn
  • Ne peut avoir qu'une seule expression, qui est également la valeur de retour.
  • return non pris en charge
  • Type-hintihg est pris en charge dans les arguments et les valeurs de retour

La manière stéréotypée d'écrire l'exemple ci-dessus:


 $ids = array_map(fn(Post $post): int => $post->id, $posts); 

Deux autres choses importantes:


  • Opérateur variable pris en charge
  • Les liens sont pris en charge pour les arguments et les valeurs de retour

Si vous souhaitez renvoyer une valeur par référence, utilisez la syntaxe suivante:


 fn&($x) => $x 

Les fonctions fléchées implémentent les mêmes fonctionnalités que vous attendez des fermetures normales, elles ne contiennent qu'une seule expression.


Pas de multiligne


Vous avez bien lu: les courts-circuits ne peuvent contenir qu'une seule expression. Cela signifie que vous ne pouvez pas contenir plusieurs lignes.


L'argument est le suivant: le but des courts-circuits est de réduire la verbosité. fn , nettement plus court que la function dans tous les sens. Ignorer la function et return mots clés ne change rien, mais cela rend le code plus lisible.


Êtes-vous d'accord avec cette opinion? En même temps, avec la nouvelle syntaxe des fonctions unifilaires, il existe de nombreuses multilignes qui ne seraient pas inhibées par une telle mise à niveau.


J'espère qu'à l'avenir, il y aura un RFC avec une courte annonce et des fonctions multi-lignes, mais jusqu'à présent, ce ne sont que mes rêves.


Variables de la portée externe


Une autre différence significative entre les défauts courts et normaux est que les premiers ne nécessitent pas l'utilisation du mot-clé use pour accéder aux données à partir d'une portée externe.


 $modifier = 5; array_map(fn($x) => $x * $modifier, $numbers); 

Il est important de noter que vous ne pouvez pas modifier ces variables. Les valeurs sont liées par valeur et non par référence. Cela signifie que vous pouvez modifier le $modifier intérieur d'un court-circuit, mais cela n'affectera pas la variable $modifier située à l'extérieur.


La seule exception est le $this , qui fonctionnera exactement de la même manière que dans la version normale:


 array_map(fn($x) => $x * $this->modifier, $numbers); 

Opportunités futures


J'ai déjà mentionné l'idée de court-circuit multi-lignes ci-dessus. Une autre suggestion utile consiste à autoriser l'utilisation d'une syntaxe courte dans les classes, par exemple pour les getters et les setters:


 class Post { private $title; fn getTitle() => $this->title; } 

En général, les fonctions fléchées sont une très bonne caractéristique, bien qu'il y ait encore place à amélioration.


Avez-vous des réflexions à ce sujet?

Source: https://habr.com/ru/post/fr476242/


All Articles