O PHP 7.4 incluirá funções de seta (notação abreviada de funções anônimas)

A votação da sintaxe abreviada para as funções está concluída (51 votos a favor, 8 contra).


Foi:


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

Tornou-se:


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

Detalhes sob o corte


A nova sintaxe é:


Sintaxe


 fn(_) => _ 

Na assinatura de uma função de seta, como em uma função regular, você pode especificar tipos, padrões, etc.


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

Atenção! Uma nova palavra-chave fn , o que significa incompatibilidade com versões anteriores!


Outras idéias de sintaxe (descartadas)


Opções consideradas:


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

e alguns outros


Variáveis ​​de fechamento


Importante! Diferentemente das versões anteriores do php, em que era necessário definir explicitamente variáveis ​​bloqueáveis ​​com o operador use , a função arrow fecha implicitamente a escala pai inteira.


Aqui estão as entradas equivalentes:


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

A variável $ this fecha como qualquer outra variável. Se esse é um comportamento indesejado, você pode desativá-lo com a palavra-chave estática .


 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 } } 

As variáveis ​​de fechamento nas funções de seta ocorrem por valor (em contraste com o idioma Go, por exemplo). I.e. alterar variáveis ​​dentro de uma função não alterará a variável no escopo pai.


Conclusões


O código se tornou muito mais compacto e, embora não seja tão compacto quanto o javascript e algumas outras linguagens, ainda será muito mais agradável escrever:


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

Diferentemente de outros idiomas, as funções de seta no php não suportam múltiplas instruções separadas por um caractere ; , porque isso (de acordo com os autores da RFC) contradiz a ideia de uma sintaxe abreviada. Talvez isso seja revisto no futuro.


Definitivamente discutiremos as funções de seta em php em detalhes no podcast Zinc Prod , por isso não deixe de se inscrever.


Link RFC

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


All Articles