fn
Das Schlüsselwort „fn" wurde in PHP 7.4 eingeführt und dient zur Erstellung von Arrow-Funktionen – einer kompakten Kurzschreibweise für anonyme Funktionen.
Das PHP-Schlüsselwort fn (Arrow-Funktionen)
Das Schlüsselwort fn, eingeführt in PHP 7.4, erstellt Arrow-Funktionen — eine kompakte Syntax zum Schreiben einzeiliger anonymer Funktionen. Eine Arrow-Funktion gibt den Wert eines einzelnen Ausdrucks zurück und erfasst automatisch die Variablen, die sie aus dem umgebenden Gültigkeitsbereich verwendet. Das macht sie ideal für kurze Callbacks, die an array-Funktionen wie array_map, array_filter und array_reduce übergeben werden.
Diese Seite behandelt die Syntax, wie sich die Variablenerfassung von klassischen Closures unterscheidet, die wichtigsten Regeln und Fallstricke sowie praktische Beispiele.
Syntax
Eine Arrow-Funktion verwendet fn, eine Parameterliste, den Operator => (Fat Arrow) und einen einzelnen Ausdruck, dessen Wert implizit zurückgegeben wird:
$arrowFunction = fn($parameter) => expression;Es gibt weder einen { ... }-Rumpf noch eine return-Anweisung — beides ist verboten. Der Ausdruck nach => ist der Rückgabewert.
$square = fn($n) => $n * $n;
echo $square(4); // 16Automatische Variablenerfassung (kein use erforderlich)
Der größte Unterschied zu einer klassischen Closure (function () use (...) { ... }) besteht darin, dass eine Arrow-Funktion automatisch per Wert jede Variable aus dem übergeordneten Gültigkeitsbereich erfasst, auf die sie verweist. Eine use-Klausel ist nie erforderlich:
Da die Erfassung ausschließlich per Wert erfolgt, können Arrow-Funktionen eine äußere Variable nicht per Referenz ändern. Wenn das benötigt wird, sollte stattdessen eine vollständige Closure mit use (&$var) verwendet werden.
Beispiele
Arrow-Funktionen eignen sich hervorragend als einzeilige Callbacks. Der Ausdruck wird automatisch zurückgegeben, ein return ist nicht notwendig.
<?php
// array_reduce — sum a list
$numbers = [1, 2, 3, 4, 5];
$sum = array_reduce($numbers, fn($carry, $number) => $carry + $number);
echo $sum . PHP_EOL; // 15
// array_filter — keep names longer than 4 characters
$names = ["John", "Maryjane", "Paul", "Jane"];
$filtered = array_filter($names, fn($name) => strlen($name) > 4);
print_r($filtered); // Array ( [1] => Maryjane )
// array_map — apply 20% tax to each price
$prices = [10, 20, 30];
$withTax = array_map(fn($p) => $p * 1.2, $prices);
print_r($withTax); // Array ( [0] => 12 [1] => 24 [2] => 36 )
// Nested arrow functions (currying) — each captures from its parent
$adder = fn($x) => fn($y) => $x + $y;
echo $adder(3)(4) . PHP_EOL; // 7Mehr über die Übergabe von Funktionen als Callbacks erfahren Sie unter PHP Callback-Funktionen.
Regeln und Fallstricke
- Nur ein Ausdruck. Arrow-Funktionen können keine Anweisungen, Schleifen oder mehrere Zeilen enthalten. Wenn die Logik einen Block erfordert, sollte eine vollständige Closure mit
function () use (...) { ... }verwendet werden. - Erfassung per Wert. Das Ändern einer erfassten Variablen innerhalb der Arrow-Funktion hat keinen Einfluss auf die äußere Variable, und spätere Änderungen an der äußeren Variablen werden nicht sichtbar.
- Keine Referenzerfassung.
use (&$var)ist nicht möglich; für das Ändern äußerer Zustände sollte eine vollständige Closure verwendet werden. - Typhinweise und Standardwerte sind erlaubt:
fn(int $n = 0): int => $n + 1. - Nur PHP 7.4+. Auf älteren Versionen muss auf
function () use (...) { ... }zurückgegriffen werden.
fn vs. function (Closures)
Arrow-Funktion (fn) | Closure (function) | |
|---|---|---|
| Variablenerfassung | Automatisch, per Wert | Explizit über use |
| Rumpf | Einzelner Ausdruck | Vollständiger Anweisungsblock |
Schlüsselwort return | Implizit | Erforderlich |
| Erfassung per Referenz | Nein | Ja, mit use (&$var) |
| Verfügbar seit | PHP 7.4 | PHP 5.3 |
fn empfiehlt sich bei kurzen, einzeiligen Callbacks. Eine vollständige Closure sollte verwendet werden, wenn mehrere Anweisungen, Referenzerfassung oder explizite Kontrolle über die erfassten Variablen benötigt werden.
Siehe auch: PHP-Funktionen · Variablen-Gültigkeitsbereich.