Funkcja strzałkowa to krótka funkcja anonimowa: fn($x) => $x * 2. Treść po => to jedno wyrażenie, którego wartość jest zwracana, a każda zmienna z otaczającego kodu, której wyrażenie używa, jest przechwytywana automatycznie, przez wartość. Funkcje strzałkowe istnieją od PHP 7.4 i służą głównie jako callbacki.
Składnia
fn, lista parametrów, =>, jedno wyrażenie. Typy parametrów, wartości domyślne i typ zwracany działają tak samo jak w zwykłych funkcjach:
Nie ma słowa kluczowego return ani nawiasów klamrowych. Długie wyrażenie nadal można dla czytelności rozbić na kilka linii.
Zmienne z zewnątrz są przechwytywane przez wartość
Funkcja strzałkowa widzi każdą zmienną zasięgu, w którym powstaje. Kopiuje ich wartości w tej chwili. Zmiany wewnątrz zostają wewnątrz, a zmiany na zewnątrz wykonane po utworzeniu funkcji nie są widoczne:
To główna różnica względem function () use (&$count), które może współdzielić zmienną przez referencję. Funkcja strzałkowa nie może przypisać nowej wartości do zmiennej z zewnątrz. Może jednak zmienić przechwycony obiekt (kopia to uchwyt do tego samego obiektu), a parametr zadeklarowany przez referencję działa jak w każdej funkcji: fn(array &$list) => $list[] = 'x'.
Callbacki dla array_map, array_filter i usort
Większość funkcji tablicowych przyjmuje callback i właśnie tam funkcje strzałkowe oszczędzają najwięcej szumu. Porównaj jeden filtr zapisany na oba sposoby:
<=> zwraca -1, 0 albo 1, czyli dokładnie to, czego chce usort(), więc sortowanie po polu mieści się w jednej linii. Zamień $a i $b, aby sortować malejąco.
Funkcje strzałkowe zwracające funkcje strzałkowe
Przechwytywane zmienne obejmują parametry otaczającej funkcji strzałkowej, więc możesz je zagnieżdżać, aby budować funkcje z innych wartości:
Zwróć uwagę, że array_filter() zachowuje oryginalne klucze, dlatego wynik zaczyna się od indeksu 1.
fn vs function: kiedy potrzebne jest pełne domknięcie
Funkcje strzałkowe przestają wystarczać, gdy treść potrzebuje więcej niż jednego wyrażenia albo musi zmienić zmienną z zewnątrz. Wtedy użyj funkcji anonimowej:
fn($x) => ... | function ($x) use ($y) { ... } | |
|---|---|---|
| Treść | jedno wyrażenie | dowolne instrukcje |
| Zwracanie | automatyczne | jawne return |
| Zmienne z zewnątrz | wszystkie użyte, automatycznie | tylko wymienione w use |
| Przechwytywanie przez referencję | nie | tak, use (&$y) |
| Dostępne od | PHP 7.4 | PHP 5.3 |
Gdy funkcji strzałkowej robi się ciasno, często oznacza to, że zadanie to tak naprawdę dwa zadania. Podzielenie go na filtr i sumę, jak wyżej, sprawia, że każdy callback pozostaje jednym wyrażeniem.
Najczęściej zadawane pytania
Czym jest funkcja strzałkowa w PHP?
Krótką funkcją anonimową wprowadzoną w PHP 7.4: fn($x) => $x * 2. Jej treść to jedno wyrażenie, którego wartość jest zwracana automatycznie, i może czytać zmienne z otaczającego zasięgu bez klauzuli use.
Czy funkcja strzałkowa w PHP może mieć wiele linii?
Nie. Treść po => musi być jednym wyrażeniem; nie ma bloku z instrukcjami. Długie wyrażenie możesz rozbić na kilka linii, ale jeśli potrzebujesz if, pętli albo kilku instrukcji, użyj zamiast tego function () use (...) { ... }.
Czy funkcja strzałkowa może zmienić zmienną z zewnątrz?
Nie. Funkcje strzałkowe przechwytują zmienne z zewnątrz przez wartość, więc fn() => $count++ zmienia tylko własną kopię, a $count na zewnątrz pozostaje bez zmian. Aby zmienić zmienną z zewnątrz, użyj domknięcia z use (&$count).
Czym różni się fn od function w PHP?
fn($x) => ... zawiera jedno wyrażenie, zwraca je niejawnie i przechwytuje przez wartość każdą użytą zmienną z zewnątrz. function ($x) use ($y) { ... } może zawierać dowolne instrukcje, wymaga jawnego return i widzi tylko zmienne wymienione w use, które mogą być przechwycone przez referencję.