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