PHP 익명 함수란?
익명 함수(Anonymous Function)는 사용자가 별도의 이름을 정의하지 않는 함수입니다. 이러한 함수는 클로저(Closure) 또는 람다(Lambda) 함수라고도 불립니다. 한 번만 사용할 목적의 함수가 필요할 때 특히 유용하며, 클로저는 자신이 정의된 환경(스코프)을 기억하는 익명 함수로서 use 키워드를 통해 외부 변수에 접근할 수 있습니다. 익명 함수의 가장 대표적인 용도는 인라인 콜백 함수를 만드는 것입니다.
기본 문법
$var = function ($arg1, $arg2) { return $val; };- 함수 이름 없음:
function키워드와 여는 괄호 사이에 함수 이름이 존재하지 않습니다. - 세미콜론 필수: 익명 함수 정의는 하나의 표현식(expression)이므로 정의 끝에 반드시 세미콜론(;)을 붙여야 합니다.
- 변수에 할당 후 호출: 함수를 변수에 담아두었다가, 나중에 변수 이름으로 호출합니다.
- 콜백(Callback): 다른 함수의 인수로 전달되어 그 함수 내부에서 나중에 호출되는 경우 콜백이라고 부릅니다.
- 클로저(Closure): 외부 함수 안에서 익명 함수를 반환하면, 그 익명 함수가 외부 함수의 변수에 접근할 수 있으며 이를 클로저라고 합니다.
익명 함수 기본 예제
다음 예제는 숫자의 세제곱을 구하는 익명 함수를 변수에 할당한 뒤 호출하는 코드입니다.
<?php
$var = function ($x) {return pow($x,3);};
echo "cube of 3 = " . $var(3);
?>
위 코드를 실행하면 아래와 같은 결과가 출력됩니다.
cube of 3 = 27
콜백으로 활용하기
다음 예제에서는 PHP 내장 함수인 usort()의 인수로 익명 함수를 전달합니다. usort() 함수는 사용자가 정의한 비교 함수를 기준으로 주어진 배열을 정렬해 줍니다.
<?php
$arr = [10,3,70,21,54];
usort ($arr, function ($x , $y) {
return $x > $y;
});
foreach ($arr as $x){
echo $x . " ";
}
?>
위 코드를 실행하면 배열 요소가 오름차순으로 정렬되어 출력됩니다.
3
10
21
54
70
클로저로 활용하기
클로저 역시 익명 함수의 일종으로, use 키워드를 사용하면 자신의 스코프 바깥에 있는 변수에 접근할 수 있습니다. 아래 예제에서는 외부 변수 $maxmarks(총점)를 익명 함수 내부에서 활용하여 백분율을 계산합니다.
<?php
$maxmarks=300;
$percent=function ($marks) use ($maxmarks) {return $marks*100/$maxmarks;};
echo "marks=285 percentage=". $percent(285);
?>
위 코드를 실행하면 아래와 같은 결과가 출력됩니다.
marks=285 percentage=95
참고: 화살표 함수(PHP 7.4 이상)
PHP 7.4부터는 화살표 함수(Arrow Function) 문법이 도입되어 클로저를 더욱 간결하게 작성할 수 있습니다. 화살표 함수는 외부 변수를 자동으로 값으로 캡처하므로 use 키워드가 필요 없습니다.
$percent = fn($marks) => $marks * 100 / $maxmarks;
또한 모든 클로저는 PHP 내부적으로 Closure 클래스의 인스턴스로 처리되므로, 필요에 따라 객체처럼 다룰 수 있다는 점도 함께 기억해 두면 좋습니다.