Menu

Funkcje strzałkowe w PHP: składnia fn() => i przykłady

Funkcja strzałkowa to anonimowa funkcja z jednym wyrażeniem, zapisywana jako fn($x) => $x * 2. Używa zmiennych z zewnątrz automatycznie, przez wartość, bez use. Poznaj składnię, sposób przechwytywania, typy, callbacki dla array_map i usort oraz sytuacje, w których lepiej użyć pełnego domknięcia.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

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żeniedowolne instrukcje
Zwracanieautomatycznejawne return
Zmienne z zewnątrzwszystkie użyte, automatycznietylko wymienione w use
Przechwytywanie przez referencjęnietak, use (&$y)
Dostępne odPHP 7.4PHP 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ę.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ