W3docs

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); // 16

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

php— editable, runs on the server

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; // 7

Mehr ü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)
VariablenerfassungAutomatisch, per WertExplizit über use
RumpfEinzelner AusdruckVollständiger Anweisungsblock
Schlüsselwort returnImplizitErforderlich
Erfassung per ReferenzNeinJa, mit use (&$var)
Verfügbar seitPHP 7.4PHP 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.

Übungen

Übung
Welche Eigenschaften haben PHP-Funktionen laut dem Artikel unter der angegebenen URL?
Welche Eigenschaften haben PHP-Funktionen laut dem Artikel unter der angegebenen URL?
Was this page helpful?