PHP 7.4 inclura des fonctions flèches (notation abrégée des fonctions anonymes)

Le vote sur la syntaxe abrégée des fonctions est terminé (51 voix pour, 8 contre).


C'était:


$result = array_filter($paths, function ($v) use ($names) { return in_array($v, $names); }); 

C'est devenu:


 $result = array_filter($paths, fn($v) => in_array($v, $names)); 

Détails sous la coupe


La nouvelle syntaxe est:


Syntaxe


 fn(_) => _ 

Dans la signature d'une fonction flèche, comme dans une fonction régulière, vous pouvez spécifier des types, des valeurs par défaut, etc.


 fn(array $x) => $x; fn(): int => $x; fn($x = 42) => $x; fn(&$x) => $x; fn&($x) => $x; fn($x, ...$rest) => $rest; 

Attention! Un nouveau mot clé fn , ce qui signifie une incompatibilité vers l'arrière!


Autres idées de syntaxe (rejetées)


Options envisagées:


  //  ,        ($x) => $x * $y //   ,     ,     { ($x) => $x + $y } //     Hack;       ($x) ==> $x * $y // ,      ($x) -> $x * $y //      $x-- > $x*$y $x --> $x * $y //    Rust,    |$x| => $x * $y 

et quelques autres


Variables de fermeture


Important! Contrairement aux versions précédentes de php, où il était nécessaire de définir explicitement des variables verrouillables avec l'opérateur use , la fonction flèche ferme implicitement toute l'échelle parent sur elle-même.


Voici les entrées équivalentes:


 $y = 1; $fn1 = fn($x) => $x + $y; $fn2 = function ($x) use ($y) { return $x + $y; }; 

La variable $ this se ferme comme toute autre variable. S'il s'agit d'un comportement indésirable, vous pouvez le désactiver avec le mot clé statique .


 class Test { public function method() { $fn = fn() => var_dump($this); $fn(); // object(Test)#1 { ... } $fn = static fn() => var_dump($this); $fn(); // Error: Using $this when not in object context } } 

La fermeture des variables dans les fonctions fléchées se fait par valeur (contrairement au langage Go, par exemple). C'est-à-dire la modification de variables à l'intérieur d'une fonction ne modifiera pas la variable dans la portée parent.


Conclusions


Le code est devenu beaucoup plus compact, et bien qu'il ne soit pas aussi compact qu'en javascript et dans d'autres langages, il sera toujours beaucoup plus agréable à écrire:


 $result = Collection::from([1, 2]) ->map(fn($v) => $v * 2) ->reduce(fn($tmp, $v) => $tmp + $v, 0); echo $result; //6 

Contrairement à certaines autres langues, les fonctions fléchées de php ne prennent pas en charge plusieurs instructions séparées par un caractère ; , car cela (selon les auteurs de la RFC) contredit l'idée d'une syntaxe abrégée. Peut-être que cela sera révisé à l'avenir.


Nous discuterons certainement des fonctions fléchées en php en détail dans le podcast Zinc Prod , alors assurez-vous de vous abonner.


Lien RFC

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


All Articles