Eine Arrow Function ist eine kurze anonyme Funktion: fn($x) => $x * 2. Der Rumpf nach => ist ein einziger Ausdruck, dessen Wert zurückgegeben wird, und jede Variable aus dem umgebenden Code, die der Ausdruck verwendet, wird automatisch eingefangen, als Wert. Arrow Functions gibt es seit PHP 7.4, und sie werden meist als Callbacks verwendet.
Die Syntax
fn, die Parameterliste, =>, ein Ausdruck. Parametertypen, Standardwerte und ein Rückgabetyp funktionieren wie bei normalen Funktionen:
Es gibt kein Schlüsselwort return und keine geschweiften Klammern. Ein langer Ausdruck lässt sich zur besseren Lesbarkeit trotzdem über mehrere Zeilen verteilen.
Äußere Variablen werden als Wert eingefangen
Eine Arrow Function sieht jede Variable des Scopes, in dem sie erzeugt wird. Sie kopiert deren Werte in diesem Moment. Änderungen innen bleiben innen, und Änderungen außen nach dem Erzeugen der Funktion sieht sie nicht:
Das ist der Hauptunterschied zu function () use (&$count), das eine Variable per Referenz teilen kann. Eine Arrow Function kann einer äußeren Variable keinen neuen Wert zuweisen. Ein eingefangenes Objekt kann sie trotzdem ändern (die Kopie ist ein Verweis auf dasselbe Objekt), und ein per Referenz deklarierter Parameter funktioniert wie in jeder Funktion: fn(array &$list) => $list[] = 'x'.
Callbacks für array_map, array_filter und usort
Die meisten Array-Funktionen nehmen einen Callback, und dort sparen Arrow Functions am meisten Ballast. Vergleiche einen Filter, auf beide Arten geschrieben:
<=> liefert -1, 0 oder 1, genau das, was usort() will, also passt das Sortieren nach einem Feld in eine Zeile. Vertausche $a und $b, um absteigend zu sortieren.
Arrow Functions, die Arrow Functions zurückgeben
Zu den eingefangenen Variablen gehören die Parameter einer umschließenden Arrow Function, also kannst du sie verschachteln, um Funktionen aus anderen Werten zu bauen:
Beachte, dass array_filter() die ursprünglichen Schlüssel behält, und deshalb beginnt das Ergebnis bei Index 1.
fn vs function: wann du eine vollständige Closure brauchst
Arrow Functions kommen an ihre Grenze, wenn der Rumpf mehr als einen Ausdruck braucht oder eine äußere Variable ändern muss. Dann verwendest du eine anonyme Funktion:
fn($x) => ... | function ($x) use ($y) { ... } | |
|---|---|---|
| Rumpf | ein Ausdruck | beliebige Anweisungen |
| Rückgabe | automatisch | explizites return |
| Äußere Variablen | alle verwendeten, automatisch | nur die in use aufgeführten |
| Einfangen per Referenz | nein | ja, use (&$y) |
| Verfügbar seit | PHP 7.4 | PHP 5.3 |
Wenn sich eine Arrow Function eng anfühlt, sind es oft zwei Aufgaben in einer. Sie in einen Filter und eine Summe aufzuteilen, wie oben, hält jeden Callback bei einem einzigen Ausdruck.
Häufig gestellte Fragen
Was ist eine Arrow Function in PHP?
Eine kurze anonyme Funktion, eingeführt mit PHP 7.4: fn($x) => $x * 2. Ihr Rumpf ist ein einziger Ausdruck, dessen Wert automatisch zurückgegeben wird, und sie kann Variablen aus dem umgebenden Scope ohne use-Klausel lesen.
Kann eine Arrow Function in PHP mehrere Zeilen haben?
Nein. Der Rumpf nach => muss ein Ausdruck sein; einen Block mit Anweisungen gibt es nicht. Du kannst einen langen Ausdruck über mehrere Zeilen verteilen, aber wenn du if, Schleifen oder mehrere Anweisungen brauchst, verwendest du stattdessen function () use (...) { ... }.
Kann eine Arrow Function eine äußere Variable ändern?
Nein. Arrow Functions fangen äußere Variablen als Wert ein, also ändert fn() => $count++ nur die eigene Kopie, und $count draußen bleibt gleich. Um eine äußere Variable zu ändern, verwendest du eine Closure mit use (&$count).
Was ist der Unterschied zwischen fn und function in PHP?
fn($x) => ... enthält einen Ausdruck, gibt ihn implizit zurück und fängt jede verwendete äußere Variable als Wert ein. function ($x) use ($y) { ... } kann beliebige Anweisungen enthalten, braucht ein explizites return und sieht nur die in use aufgeführten Variablen, die auch per Referenz eingefangen werden können.