Menu

PHP 화살표 함수: fn() => 문법과 예제

화살표 함수는 fn($x) => $x * 2처럼 쓰는 표현식 하나짜리 익명 함수입니다. use 없이 바깥 변수를 값으로 자동으로 씁니다. 문법, 캡처 방식, 타입, array_map과 usort 콜백, 대신 완전한 클로저를 써야 할 때를 알아봅니다.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

화살표 함수는 짧은 익명 함수입니다: 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.4PHP 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에 나열한 변수만 보고, 그 변수는 참조로 캡처할 수도 있습니다.

Coddy 프로그래밍 언어 일러스트

Coddy로 코딩 배우기

시작하기