Funciones de flecha en PHP 7.4


Las funciones de flecha, también llamadas cierres cortos , son una buena manera de escribir código limpio en PHP. Esta forma de escritura será útil al pasar cierres a funciones como array_map o array_filter .


Un ejemplo:


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

Solía ​​escribirse así:


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

Brevemente:


  • Disponible desde PHP 7.4
  • Comience con la palabra clave fn
  • Solo puede tener una expresión, que también es el valor de retorno.
  • return no admitida
  • Type-hintihg es compatible con argumentos y valores de retorno

La forma estereotipada de escribir el ejemplo anterior:


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

Otras dos cosas importantes:


  • Operador variable compatible
  • Los enlaces son compatibles tanto para argumentos como para valores de retorno

Si desea devolver un valor por referencia, use la siguiente sintaxis:


 fn&($x) => $x 

Las funciones de flecha implementan la misma funcionalidad que espera de los cierres normales, solo contienen una expresión.


No multilínea


Has leído bien: los cortocircuitos pueden contener solo una expresión. Esto significa que no puede tener varias líneas en ellas.


El argumento es este: el objetivo de los cortocircuitos es reducir la verbosidad. fn , definitivamente más corto que la function en todos los sentidos. Omitir la function y return palabras clave no cambia nada, pero hace que el código sea más legible.


¿Estás de acuerdo con esta opinión? Al mismo tiempo, con la nueva sintaxis para las funciones de una sola línea, hay muchas líneas múltiples que no se verían inhibidas por dicha actualización.


Con suerte, en el futuro, habrá un RFC con un breve anuncio y funciones de varias líneas, pero hasta ahora estos son solo mis sueños.


Variables desde el alcance externo


Otra diferencia significativa entre cortocircuitos y fallas normales es que las primeras no requieren el uso de la palabra clave use para acceder a los datos desde un ámbito externo.


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

Es importante tener en cuenta que no puede modificar estas variables. Los valores están relacionados por valor, no por referencia. Esto significa que puede modificar el modificador $modifier dentro de un corto circuito, pero esto no afectará la variable $modifier ubicada afuera.


La única excepción es la $this , que funcionará exactamente igual que en la versión normal:


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

Oportunidades futuras


Ya mencioné la idea de cortocircuito de varias líneas arriba. Otra sugerencia útil es permitir el uso de sintaxis corta en las clases, por ejemplo, para captadores y definidores:


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

En general, las funciones de flecha son una característica muy buena, aunque todavía hay margen de mejora.


¿Tienes alguna idea sobre esto?

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


All Articles