
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:
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?