익명 함수


지금까지 우리는 함수를 정의하고 호출을 하는 기준은 함수의 이름이었습니다. 하지만 톡특하게도 함수의 이름 없이 사용하는 경우가 있습니다. 익명 함수는 또 다른 말로 람다 함수라고도 표현합니다. 익명 함수는 말 그대로 함수의 이름이 없는 형태의 함수입니다.

익명 함수는 함수의 매개변수, 함수의 반환값 또는 변수와 바인딩(결합)하여 사용 합니다.
또한 익명 함수는 콜백 함수에 많이 사용을 합니다.

PHP 5.3 이전에는 콜백 함수를 정의하는 명확한 방법이 없었습니다.
create_function()과 같은 함수를 응용하여 처리를 해야 하는 프로그램은 가독성이 떨어지고 유지보수가 어려운 점이 있었습니다.



익명 함수 문법


함수는 항상 선언과 호출을 같이 쌍으로 이뤄진 형태의 문법입니다.
하지만 익명 함수는 기존 함수의 정의 후 호출하는 것과 달리 필요할 때마다 즉시 생성한 후에 호출하여 사용할 수 있습니다.

문법

function (인자1, 인자2, 인자3 ...) {
함수 정의 몸체 ... 
소스 코드 내용 
}

위의 익명 함수 예제를 보면 함수 선언 키워드 function과 매개변수 인자 () 선언 사이에 있는 함수명이 생략되어 있습니다.
이러한 코딩 표현은 소스상에서 선언과 바로 실행 호출됩니다.

이러한 특성의 익명 함수는 한 번만 사용하는 일회성 함수를 모두 정의해서 프로그램에 상주하지 않고 필요할 때마다 간략하게 함수를 사용할 수 있는 특징이 있습니다.


변수 바인딩


익명 함수는 변수에 바인딩(결합)하여 사용할 수 있습니다. 약간 가변 함수와 유사하다고 생각할 수도 있습니다.
가변 함수는 변수에 선언한 함수를 바인딩하는 것이었고, 익명함수 변수 바인딩은 함수 자체를 바인딩하는 것입니다.

변수 바인딩

$변수명 = function (인자){
}

위와 같은 형태의 문법은 익명 함수를 변수에 결합하게 됩니다.
변수에 결합된 익명 함수를 가변 함수로 호출하는 것처럼 함수를 호출하여 사용할 수 있습니다.

익명 함수 호출

$변수명(인자);

익명 함수를 변수에 바인딩 결합하여 호출하는 문법 표현은 가변 함수 호출하는 방식과 매우 유사합니다.
가변 함수는 선언한 함수명을 변수에 대입하여 호출하는 것이고, 익명 변수는 함수 선언으로 바인딩 결합합니다.

예제 파일 func-20.php

<?php
$meeting = function($name)
{
    printf("Hello %s\r\n", $name);
};

$meeting('jiny');
?>

결과

Hello jiny 

위의 예제는 익명 함수를 통하여 문자열의 수를 출력합니다. $meeting 변수에 문자열을 출력하는 익명 함수를 바인딩 결합합니다. 또한 매개변수 인자로는 하나의 이름을 받습니다. 결합된 변수를 통하여 함수를 호출합니다.


콜백 함수


일반적으로 함수는 호출 시 매개변수 입력과 함수 내부의 처리 후 결과값을 return으로 반환하는 구조로 되어 있습니다.
또한 반환 키워드 return으로 함수가 반환되면 실행 제어권은 동작하는 현재의 함수를 탈출하여 호출한 실행 지점으로 돌아가게 됩니다.

하지만 return을 콜백 함수 형태로 정의하면 함수를 호출한 실행 지점으로 반환되는 것이 아니라 재귀 함수처럼 콜백 함수로 한 번 더 새로운 함수로 진입하는 것과 비슷합니다. 즉 한 번 더 함수를 실행하는 것과 같습니다.

익명 함수는 콜백 함수로 많이 이용하는 기술입니다.

예제 파일 README.txt

안녕하세요. jinyPHP입니다. 

아래 예제는 위의 예제 txt 파일을 읽어서 화면에 출력하는 예제입니다.
옛날 고전적인 create_function() 함수를 사용하는 방법과 최신 익명 함수를 사용하는 두 가지 예제입니다.

콜백 호출
예제 파일) func-21.php

  • 옛날 create_function() 함수를 통한 콜백 처리 ``` <?php /* 유닉스 형식 명령줄 필터로
    • 문단의 첫 대문자를 소문자로 바꿉니다. */ $fp = fopen(“README.txt”, “r”) or die(“stdin을 읽을 수 없습니다”); while (!feof($fp)) { $line = fgets($fp);

      $line = preg_replace_callback( ‘|<p>\s*\w|’, create_function( // 여기에서 홑따옴표가 중요합니다. // 혹은 모든 $를 $로 회피해야 합니다. ‘$matches’, ‘return strtolower($matches[0]);’ ), $line );

      echo $line; } fclose($fp); ?> ```

결과

안녕하세요. jinyPHP입니다. 
  • 익명 함수를 통한 콜백 처리

예제 파일 func-22.php

<?php
    /* 유닉스 형식 명령줄 필터로
     * 문단의 첫 대문자를 소문자로 바꿉니다. */
    $fp = fopen("README.txt", "r") or die("can't read stdin");
    while (!feof($fp)) {
        $line = fgets($fp);
        $line = preg_replace_callback(
            '|<p>\s*\w|',
            
            function ($matches) {
                return strtolower($matches[0]);
            },

            $line
        );
        echo $line;
    }
    fclose($fp);
?>

결과

안녕하세요. jinyPHP입니다.

위의 예제는 콜백을 이용한 정규표현식 검색과 치환을 수행하는 함수의 콜백 처리로 익명 함수를 사용한 예제입니다.