프로그래밍/Php

php 람다 클로저 익명함수

소행성왕자 2018. 10. 15. 15:00
php 람다 클로저 익명함수


람다란 무엇입니까 ?

Lambda는 변수에 할당되거나 다른 함수에 인수로 전달 될 수 있는 익명의 함수입니다.
Javascript 나 Ruby와 같은 다른 프로그래밍 언어에 익숙하다면 익명의 기능에 익숙 할 것입니다.

익명함수 ?

익명 함수는 단순히 이름이없는 함수입니다.

예를 들어 일반적인 정규 함수를 만들려면 다음과 같이 작성할 수 있습니다.

1
2
3
function greeting () {  
    return "Hello world";  
}  
cs


그런 다음이 함수를 다음과 같이 간단하게 호출 할 수 있습니다.

1
2
echo greeting();  
// Returns "Hello world"  
cs

익명 함수는 이름이 없으므로 다음과 같이 정의합니다.


1
2
3
function () {  
    return "Hello world";  
}  
cs



람다 사용하기

함수에는 이름이 없으므로 일반 함수처럼 호출 할 수 없습니다.
대신 변수를 변수에 할당하거나 다른 함수에 인수로 전달해야합니다.

1
2
3
4
5
6
7
8
9
10
// Anonymous function  
// assigned to variable  
$greeting = function () {  
    return "Hello world";  
};
 
 
// Call function  
echo $greeting();  
// Returns "Hello world"  
cs
 

익명의 함수를 사용하기 위해서, 변수에 변수를 할당 한 다음 그 변수를 함수로 호출합니다.

다음과 같이 다른 함수에 함수를 전달할 수도 있습니다.

1
2
3
4
5
6
7
8
9
// Pass Lambda to function  
function shout ($message){  
    echo $message();  
}
 
// Call function  
shout(function(){  
    return "Hello world";  
});  
cs


그렇다면 왜 람다를 사용할까요 ?

람다는 한번 쓸 수 있는 기능을 버리므로 유용합니다.
종종 작업을 수행하는 함수가 필요하지만 전역 범위 내에서 사용하거나 코드의 일부로 사용할 수 있도록 만드는 것이 타당하지 않습니다.
함수를 한 번 사용한 다음 거짓말을 하는 대신 Lambda를 사용할 수 있습니다.

물론 PHP에서 create_function 함수를 사용할 수 있게되었습니다.
이것은 기본적으로 동일한 작업을 수행합니다.

1
2
3
4
5
// Use create_function  
$greeting = create_function(”, ‘echo "Hello World!";’);
 
// Call function  
$greeting();  
cs



그렇다면 클로져(Closure)란 무엇일까요 ?

Closure는 본질적으로 람다와 동일하지만, 생성 된 범위 밖의 변수에 액세스 할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
// Create a user  
$user = "Philip";
 
// Create a Closure  
$greeting = function() use ($user) {  
    echo "Hello $user";  
};
 
// Greet the user  
$greeting(); // Returns "Hello Philip"  
cs

위에서 볼 수 있듯이 Closure는 $user 변수에 액세스 할 수 있습니다.
Closure 함수 정의의 use 절에서 선언 되었기 때문입니다.
클로저 내에서 $user 변수를 변경하면 원래 변수에 영향을 미치지 않습니다.
원래 변수를 업데이트하기 위해 &를 추가 할 수 있습니다.
변수 앞에있는 &는 참조를 의미하므로 원래 변수도 업데이트됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Set counter  
$i = 0;  
// Increase counter within the scope  
// of the function  
$closure = function () use ($i){ $i++; };  
// Run the function  
$closure();  
// The global count hasn’t changed  
echo $i; // Returns 0
 
// Reset count  
$i = 0;  
// Increase counter within the scope  
// of the function but pass it as a reference  
$closure = function () use (&$i){ $i++; };  
// Run the function  
$closure();  
// The global count has increased  
echo $i; // Returns 1
cs


클로저는 array_map, array_filter, array_reduce 또는 array_walk와 같은 콜백 함수를 허용하는 PHP 함수를 사용할 때도 유용합니다.

1
2
3
4
5
6
7
8
9
10
11
// An array of names  
$users = array("John""Jane""Sally""Philip");
 
// Pass the array to array_walk  
array_walk($users, function ($name) {  
echo "Hello $name<br>";  
});  
// Returns  
// -> Hello John  
// -> Hello Jane  
// -> .. 
cs

다시 말하면, use 절 을 사용하여 Closure 범위 밖의 변수에 액세스 할 수 있습니다 .

1
2
3
4
5
6
7
8
9
10
11
// Set a multiplier  
 $multiplier = 3;
 
// Create a list of numbers  
 $numbers = array(1,2,3,4);
 
// Use array_walk to iterate  
 // through the list and multiply  
 array_walk($numbers, function($number) use($multiplier){  
 echo $number * $multiplier;  
 });  
cs

의 예에서 두 숫자를 함께 곱하는 함수를 만드는 것은 의미가 없습니다.
이런 일을 할 수있는 함수를 만들려면 코드로 돌아와 나중에 왜 한 번만 사용할 수있는 전역 적으로 액세스 할 수있는 함수를 만드는 데 어려움을 겪었습니까?
Closure를 콜백으로 사용하면 이 함수를 한 번 사용한 다음 잊어 버릴 수 있습니다.


그렇다면 정말로 어디에서 사용할수 있을까요?

우리는 Lambdas와 Closure가 익명의 함수이며 전역 네임 스페이스를 오염시키지 않고 콜백의 일부로 사용할 수있는 기능을 버릴 수 있음을 입증했습니다.

이러한 유형의 기능을 사용하는 가장 보편적 인 예로 현대 프레임 워크 내에서 라우팅 요청이 있습니다. 

예를 들어 Laravel 을 사용하면 다음을 수행 할 수 있습니다.

1
2
3
Route::get(‘user/(:any)’, function($name){  
    return "Hello " . $name;  
}); 
cs

위의 코드는 / user / philip 과 같은 URL을 단순히 비교 하고 인사말을 반환합니다.

이것은 매우 기본적인 예제이지만 Closure가 매우 유용한 상황에서 활용 될 수있는 방법을 강조합니다.


결론

람다와 클로저는 초보자 프로그래머라면 두 가지 매우 깊은 컴퓨터 과학 용어처럼 보입니다.

그러나 사실 전혀 복잡하지 않습니다.

Lambdas와 Closure 둘 다 하나의 오프 (offs)에서 유용하거나 함수를 정의하는 것이 의미가 없는 익명의 함수입니다.

Lambdas와 Closure는 PHP를 처음 접했고 다른 언어와 똑같은 사용법을 따르지 않습니다.

Javascript에 익숙하다면 익명의 함수가 많이 사용됩니다.

특히 jQuery에서 많은 좋은 예제를 볼 수있다.

패턴을 인식 할 수있게되면 코드를 훨씬 쉽게 이해할 수 있습니다.

그 이유는 무엇이 진행되고 있는지 이해할 수있을뿐 아니라 왜 처음에 그렇게 쓰여졌는지와 개발자가 의사 결정을 통해 달성하려고 시도한 이유를 이해할 수 있기 때문입니다.