본문으로 바로가기

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 ) */


3. 클로저란
- 이전에는 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 함수가 거의 없기 때문.
- 하지만 자체 범위 내에서는 논리를 캡슐화해야 할 경우 클로저를 사용
- 이러한 경우 기존 코드를 단순하고 읽기 쉽게 만들기 위래 리펙토링 할 때 발생

참고 블로그 :