7.02. 익명 함수 사용하기

익명함수는 한번만 사용할 일회성 함수로 이름이 없는 함수라는 뜻이다. 익명함수를 만들고 사용하는 방법을 알아본다.

<?php
$datas = [1,2,"3","4","오","률",7];

$checker = 2;

$filter_data = array_filter($datas, 
    function($item) use ($checker) {
        return $item == $checker;
    }
);

var_dump($filter_data);

위 코드를 anonymous_func.php 파일에 저장하고 브라우저에서 결과를 확인한다.

array(1) { [1]=> int(2) } 

예제 코드에서 익명함수 부분은 아래와 같다.

    function($item) use ($checker) {
        return $item == $checker;
    }

익명함수는 일회성 함수로 이름이 없는 함수다. 주로 콜백(callback) 을 파라미터로 입력받는 함수의 파라미터로 사용된다. 일회성 함수이기 때문에 재활용은 불가능하다.


array_filter 함수는 배열에서 특정 조건에 맞는 항목만 뽑아내는 내장 함수다. 인수로 콜백 함수를 받는다.

array_filter(배열, 콜백 함수);

array_filter 함수의 동작 방식은 다음과 같다.

  • array_filter 함수는 내부적으로 배열 항목을 순회하면서 하나씩 파라미터로 전달받은 콜백 함수에 파라미터로 전달한다.
  • 콜백 함수는 배열 항목이 조건에 맞는지 검사하고 true 혹은 false를 리턴한다.
  • array_filter 함수는 콜백 함수에서 true 가 리턴된 것만 따로 모아서 새로운 배열을 만들어낸다.

동작을 따라가 보자.
array_filter 함수는 데이터를 하나씩 순회한다. 첫번째 항목은 $data[0]의 값 1이다.

$datas = [1

$data 의 첫번째 항목 1이 입력되면, 익명함수의 $item 파라미터에 전달된다.

function($item)

익명 함수는 $item의 값 1이 $checker 변수의 값 2와 일치하는지 여부를 리턴한다.

return $item == $checker;

array_filter 함수는 반환값이 false 이므로, 버린다.

두번째 항목 2는 $checker와 일치하므로 array_filter 함수가 내부적으로 가지고 있는다.

나머지 항목도 동일한 규칙으로 반복한다.

최종적으로 일치하는 값은 $datas[1]에 해당하는 값 2 하나이므로 $filter_data의 변수에는 array(1) { [1]=> int(2) } 값이 담긴다.


익명 함수는 function ($item) 처럼 function 뒤에 함수 이름이 아니라 바로 파라미터가 선언된다.


함수 파라미터 뒤의 use 는 익명 함수에서 클로져(closure) 를 이용하기 위해 use(사용할 외부 변수) 형식으로 선언된다.

function($item) use ($checker) {

클로져란 함수가 스코프 밖의 범위에 접근하기 위해 사용되는 것이다.
php 의 함수는 외부의 변수와 소통할 방법이 파라미터 혹은 global 키워드를 쓰는 방법밖에 없는 블랙박스 모델이기 때문에 외부 변수를 자연스럽게 참조할 수 있는 방법이 없다. 이 문제를 해결하기 위해 use (외부변수명) 으로 함수가 외부 스코프를 명시적으로 참고할 수 있게 한다.
만약 위 예시에서 use ($checker) 를 사용하지 않으면 함수 내부에서 $checker 변수에 접근하지 못하므로 undefined variable 오류가 난다.

use 키워드는 클로져를 사용할 때 외에 네임스페이스를 사용할 때도 쓰인다. 물론 용도는 전혀 다르다. 네임스페이스를 사용할 때는 이렇게 사용한다.

Copyuse app\yse\component;