화살표 함수는 짧은 익명 함수입니다: fn($x) => $x * 2. => 뒤의 본문은 그 값이 반환되는 표현식 하나이고, 표현식이 사용하는 주변 코드의 변수는 값으로 자동 캡처됩니다. 화살표 함수는 PHP 7.4부터 있으며 주로 콜백으로 씁니다.
문법
fn, 매개변수 목록, =>, 표현식 하나입니다. 매개변수 타입, 기본값, 반환 타입은 일반 함수와 똑같이 동작합니다.
return 키워드도 중괄호도 없습니다. 긴 표현식은 읽기 좋게 여러 줄로 나눌 수 있습니다.
바깥 변수는 값으로 캡처된다
화살표 함수는 자신이 만들어진 스코프의 모든 변수를 봅니다. 그 순간의 값을 복사합니다. 안에서 바꾼 것은 안에만 남고, 함수를 만든 뒤 바깥에서 바꾼 것은 보이지 않습니다.
이것이 변수를 참조로 공유할 수 있는 function () use (&$count)와의 주된 차이입니다. 화살표 함수는 바깥 변수에 다시 대입할 수 없습니다. 캡처한 객체는 바꿀 수 있고(복사본이 같은 객체를 가리키는 핸들이므로), 참조로 선언한 매개변수는 다른 함수처럼 동작합니다: fn(array &$list) => $list[] = 'x'.
array_map, array_filter, usort 콜백
대부분의 배열 함수는 콜백을 받으며, 화살표 함수가 군더더기를 가장 많이 줄여 주는 곳이 여기입니다. 같은 필터를 두 방식으로 쓴 것을 비교해 보세요.
<=>는 usort()가 원하는 정확히 -1, 0, 1을 반환하므로 필드 기준 정렬이 한 줄에 들어갑니다. 내림차순으로 정렬하려면 $a와 $b를 바꾸세요.
화살표 함수를 반환하는 화살표 함수
캡처되는 변수에는 감싸는 화살표 함수의 매개변수도 포함되므로, 중첩해서 다른 값으로부터 함수를 만들 수 있습니다.
array_filter()는 원래 키를 유지하므로 결과가 인덱스 1부터 시작합니다.
fn과 function: 완전한 클로저가 필요할 때
본문에 표현식이 둘 이상 필요하거나 바깥 변수를 바꿔야 하면 화살표 함수로는 안 됩니다. 그럴 때는 익명 함수를 쓰세요.
fn($x) => ... | function ($x) use ($y) { ... } | |
|---|---|---|
| 본문 | 표현식 하나 | 어떤 문장이든 |
| 반환 | 자동 | 명시적 return |
| 바깥 변수 | 사용한 것 모두 자동으로 | use에 나열한 것만 |
| 참조 캡처 | 불가 | 가능, use (&$y) |
| 도입 버전 | PHP 7.4 | PHP 5.3 |
화살표 함수가 비좁게 느껴진다면 대개 그 일이 사실 두 가지 일이라는 뜻입니다. 위처럼 필터와 합계로 나누면 각 콜백이 표현식 하나로 유지됩니다.
자주 묻는 질문
PHP의 화살표 함수는 무엇인가요?
PHP 7.4에서 도입된 짧은 익명 함수입니다: fn($x) => $x * 2. 본문은 표현식 하나이고 그 값이 자동으로 반환되며, use 절 없이 주변 스코프의 변수를 읽을 수 있습니다.
PHP 화살표 함수를 여러 줄로 쓸 수 있나요?
아니요. => 뒤의 본문은 표현식 하나여야 하며 문장으로 된 블록은 없습니다. 긴 표현식을 여러 줄로 나눌 수는 있지만, if, 반복문, 여러 문장이 필요하면 function () use (...) { ... }를 쓰세요.
화살표 함수가 바깥 변수를 수정할 수 있나요?
아니요. 화살표 함수는 바깥 변수를 값으로 캡처하므로 fn() => $count++는 자신의 복사본만 바꾸고 바깥의 $count는 그대로입니다. 바깥 변수를 수정하려면 use (&$count)가 있는 클로저를 쓰세요.
PHP에서 fn과 function의 차이는 무엇인가요?
fn($x) => ...는 표현식 하나를 담고, 그것을 암묵적으로 반환하며, 사용하는 모든 바깥 변수를 값으로 캡처합니다. function ($x) use ($y) { ... }는 어떤 문장이든 담을 수 있고, 명시적인 return이 필요하며, use에 나열한 변수만 보고, 그 변수는 참조로 캡처할 수도 있습니다.