
Pfeilfunktionen, auch Short Closures genannt , sind eine gute Möglichkeit, sauberen Code in PHP zu schreiben. Diese Form des Schreibens ist nützlich, wenn Closures an Funktionen wie array_map
oder array_filter
.
Ein Beispiel:
Früher war es so geschrieben:
$ids = array_map(function ($post) { return $post->id; }, $posts);
Kurz gesagt:
- Verfügbar seit PHP 7.4
- Beginnen Sie mit dem Schlüsselwort
fn
- Kann nur einen Ausdruck haben, der auch der Rückgabewert ist.
- Nicht unterstützte
return
- Typ-Hinweis wird in Argumenten und Rückgabewerten unterstützt
Die stereotype Schreibweise des obigen Beispiels:
$ids = array_map(fn(Post $post): int => $post->id, $posts);
Zwei weitere wichtige Dinge:
- Variablenoperator unterstützt
- Links werden sowohl für Argumente als auch für Rückgabewerte unterstützt
Wenn Sie einen Wert als Referenz zurückgeben möchten, verwenden Sie die folgende Syntax:
fn&($x) => $x
Pfeilfunktionen implementieren die gleiche Funktionalität, die Sie von normalen Closures erwarten, sie enthalten nur einen Ausdruck.
Keine mehrzeilige
Sie lesen das richtig: Kurzschlüsse können nur einen Ausdruck enthalten. Dies bedeutet, dass Sie nicht mehrere Zeilen enthalten können.
Das Argument lautet: Das Ziel von Kurzschlüssen ist die Reduzierung der Ausführlichkeit. fn
, definitiv kürzer als function
in jeder Hinsicht. Das Überspringen der function
und der return
Schlüsselwörter ändert nichts, macht den Code jedoch besser lesbar.
Stimmen Sie dieser Meinung zu? Gleichzeitig gibt es mit der neuen Syntax für einzeilige Funktionen viele mehrzeilige, die durch ein solches Upgrade nicht blockiert würden.
Hoffentlich gibt es in Zukunft einen RFC mit einer kurzen Ansage und mehrzeiligen Funktionen, aber bisher sind dies nur meine Träume.
Variablen aus dem äußeren Bereich
Ein weiterer wesentlicher Unterschied zwischen kurzen und normalen Fehlern besteht darin, dass bei ersteren die Verwendung des Schlüsselworts use nicht erforderlich ist, um auf Daten aus einem externen Bereich zuzugreifen.
$modifier = 5; array_map(fn($x) => $x * $modifier, $numbers);
Es ist wichtig zu beachten, dass Sie diese Variablen nicht ändern können. Werte beziehen sich auf Werte, nicht auf Referenzen. Dies bedeutet, dass Sie den $modifier
innerhalb eines Kurzschlusses ändern können, dies hat jedoch keine Auswirkungen auf die $modifier
außerhalb des Kurzschlusses.
Die einzige Ausnahme ist das $this
, das genauso funktioniert wie in der normalen Version:
array_map(fn($x) => $x * $this->modifier, $numbers);
Zukunftschancen
Ich habe oben bereits die Idee eines Mehrleiterkurzschlusses erwähnt. Ein weiterer nützlicher Vorschlag ist, die Verwendung von Kurzsyntax in Klassen zuzulassen, z. B. für Getter und Setter:
class Post { private $title; fn getTitle() => $this->title; }
Im Allgemeinen sind Pfeilfunktionen eine sehr gute Funktion, obwohl noch Verbesserungsbedarf besteht.
Hast du irgendwelche Gedanken dazu?