Funções de seta no PHP 7.4


As funções de seta, também chamadas de fechamentos curtos , são uma boa maneira de escrever código limpo em PHP. Essa forma de escrita será útil ao passar fechamentos para funções como array_map ou array_filter .


Um exemplo:


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

Costumava ser escrito assim:


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

Resumidamente:


  • Disponível desde o PHP 7.4
  • Comece com a palavra-chave fn
  • Pode ter apenas uma expressão, que também é o valor de retorno.
  • return não suportado
  • Hintihg de tipo é suportado em argumentos e valores de retorno

A maneira estereotipada de escrever o exemplo acima:


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

Duas outras coisas importantes:


  • Operador variável suportado
  • Os links são suportados para argumentos e valores de retorno

Se você deseja retornar um valor por referência, use a seguinte sintaxe:


 fn&($x) => $x 

As funções de seta implementam a mesma funcionalidade que você espera dos fechamentos normais, elas contêm apenas uma expressão.


Sem multilinha


Você leu certo: os curtos-circuitos podem conter apenas uma expressão. Isso significa que você não pode ter várias linhas nelas.


O argumento é este: o objetivo dos curtos-circuitos é reduzir a verbosidade. fn , definitivamente menor que a function em todos os sentidos. Ignorar a function e return palavras-chave não altera nada, mas torna o código mais legível.


Você concorda com esta opinião? Ao mesmo tempo, com a nova sintaxe para funções de linha única, existem muitas de várias linhas que não seriam inibidas por essa atualização.


Felizmente, no futuro, haverá uma RFC com um breve anúncio e funções de várias linhas, mas até agora esses são apenas meus sonhos.


Variáveis ​​do escopo externo


Outra diferença significativa entre falhas curtas e normais é que as primeiras não exigem o uso da palavra-chave use para acessar dados de um escopo externo.


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

É importante observar que você não pode modificar essas variáveis. Os valores estão relacionados por valor, não por referência. Isso significa que você pode modificar o $modifier dentro de um curto-circuito, mas isso não afetará a variável $modifier localizada fora.


A única exceção é a $this , que funcionará exatamente da mesma forma que na versão normal:


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

Oportunidades futuras


Eu já mencionei a idéia de curto-circuito de várias linhas acima. Outra sugestão útil é permitir o uso de sintaxe curta nas classes, por exemplo, para getters e setters:


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

Em geral, as funções de seta são um recurso muito bom, embora ainda haja espaço para melhorias.


Você tem alguma opinião sobre isso?

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


All Articles