1. 람다 함수(또는 익명함수)
- 언제라도 정의할 수 있고 일반적으로 변수에 바인딩되(결합할수있)는 임시 함수
- 함수 자체는 자신이 정의된 변수의 범위 내에만 존재하기 때문에 해당 변수가 범위를 벗어나면 함수도 범위를 벗어나게 됨
2. 람다 함수의 활용
- 콜백함수에 많이 사용.
- array_map()
함수를 사용하면 전체 뱌열을 순환하면 배열의 각 요소에 콜백함수를 적용.
- 하지만 이전에는(php 5.3 이전) 콜백함수를 정의하는 명확한 방법이 없었음.
따라서, 가독성이 떨어지고 유지 관리가 어려웠음
- 또한 같은 코드 블록 내에 콜백 함수를 정의하고 이름을 지정하게 될 때는 네임스페이스 충돌을 피하기 위해 주변에 if를 추가하여 충돌을 막음
function quoteWords() {
return array_map('quoteWordsHelper',
funciton ($string) { //람다 함수
return preg_replace('/(\w)/', '"$1"', $string);
});
}
* 참고 : array_map
이란?- array array_map ( callback callback, array arr1 [, array ...] )
- 배열의 각 원소에 사용자가 정의한 함수를 적용하고 적용한 후의 결과를 배열로 반환한다.
$food_type = array("food", "beverage", "cuisine", "fruit");
$food_name = array("pizza", "cola", "pasta", "apple");
function showFoods($a, $b) {
return $b . " is " . $a;
}
$foods = array_map("showFoods", $food_type, $food_name);
print_r($foods);
/* Array ( [0] => pizza is food
[1] => cola is beverage
[2] => pasta is cuisine
[3] => apple is fruit ) */
- 이전에는 create_function를 사용하여 수행 가능 했지만 람다함수는 여전히 임시 함수이고 상태를 유지하지 않기 때문에
이러한 함수를 사용하여 수행할 수 있는 작업에 한계가 있었음.
* 참고 :
create_function
이란?string create_function ( string $args , string $code )
전달 된 매개 변수로 익명 함수를 만들고 그것을 반환
$av = array("the ", "a ", "that ", "this ");
array_walk($av, create_function('&$v,$k', '$v = $v . "mango";'));
print_r($av);
/*Array( [0] => the mango
[1] => a mango
[2] => that mango
[3] => this mango ) */
- 함수를 임시로 만들어서 다른 언어에게 매개변수(parmeter)로 전달할 수 있는 언어로 주로 사용. 자체 환경 내에서 평가되는 함수이며 해당 함수가 호출될 때 액세스 할 수 있는 바인딩 된 변수를 한 개 이상 가지고 있음.
- 람다함수와 유사하지만 클로저가 정의된 한병의 외부에 있는 변수와 상호 작용할 수 있다는 점이 차이점
$string = "Hello World";
$closure = function() use ($string) { echo $string; };
$closure();
//Output : Hello World
- 예시 처럼 외부 환경에서 가벼올 변수는 클로저 함수 정의의 use
절에 지정- 클로저 함수 정의 내에서 전달된 값을 업데이트 하더라도 외부 값은 업데이트 되지 않음.
- 하지만, 참조 정의를 사용
(&연산자를 변수 앞에 추가)하면 호출 시 값이 업데이트 되는것을 알 수 있음.
$x = 1;
$closure = function() use (&$x) { ++x; }
echo $x; //1
$closure();
echo $x; //2
$closure();
echo $x; //3
- 오브젝트 내에서 클로저를 정의한 경우 명시적으로 가져오지 않더라도 클로저에서 $this 변수를 통해 오브젝트에 쉽게 엑세스 됨
(클로저는 클래스 내부 또는 외부에서 사용하거나 상관 없이 작은 범위 내에서 바인딩할 특정 함수를 포함하기 위해 사용.
오브젝트 외부에 있는 것처럼 오브젝트 내에서도 쉽게 사용,
$this
를 통해 오브젝트를 자동으로 가져온다는 것)- 클로저를 static으로 지정하여 기능을 비활성화할 수도 있음.
4. 클로저를 사용하는 목적
- 콜백 함수를 매개변수(parameter)로 받는 PHP 함수가 거의 없기 때문.
- 하지만 자체 범위 내에서는 논리를 캡슐화해야 할 경우 클로저를 사용
- 이러한 경우 기존 코드를 단순하고 읽기 쉽게 만들기 위래 리펙토링 할 때 발생
참고 블로그 :