안녕하세요. 명월입니다.
이 글은 PHP의 익명 함수(람다식)와 클로져(closure)에 대한 글입니다.
먼저 익명 함수의 개념은 Javascript에서 콜백 함수 기능이라고 생각하면 됩니다.
<?php
function runTest($func) {
//$func가 함수라면..(javascript에서 typeof 변수 === "function" 과 같은 역할이다.)
if (is_callable($func)) {
// 함수를 실행하고 파라미터를 10과 5를 넘긴다.
return $func(10, 5);
}
return 0;
}
// 익명 함수로 rutTest함수에 함수를 넘겼다.
$add = runTest(function ($a, $b) {
// 10과 5가 오게 되면 더하고 결과를 내보낸다.
return $a + $b;
});
// 익명 함수로 rutTest함수에 함수를 넘겼다.
$subtract = runTest(function ($a, $b) {
// 10과 5가 오게 되면 빼고 결과를 내보낸다.
return $a - $b;
});
?>
<!DOCTYPE html>
<html>
<head>
<title>title</title>
</head>
<body>
<!-- $add값은 15가 된다. -->
add : <?=$add?>
<br />
<!-- $subtract값은 5가 된다. -->
subtract : <?=$subtract?>
</body>
</html>
위 소스를 보면 제가 runTest로 함수를 넘깁니다. 물론 이 함수들은 함수명이 정해지지 않은 일회성 함수입니다.
클로저의 개념은 Java와 C#, Javascript의 클로져와 같은 개념입니다. 클로저는 함수을 작성하면 외부에서 선언한 변수를 식 안으로 값을 점프해서 넣을 수 있습니다. 실제 메모리 상에서는 전혀 다른 메모리 영역이기 때문에 메모리가 공유가 되지 않아야 합니다만 사용할 수 있게 하는 기능이 클로져입니다.
<?php
$message = 'hello';
$example1 = function () {
var_dump($message);
};
// 클로저 기능으로 use를 선언하고 $message 변수값을 클로저로 사용한다.
$example2 = function () use ($message) {
var_dump($message);
};
// 함수 실행!
$example1();
$example2();
?>
<!DOCTYPE html>
<html>
<head>
<title>title</title>
</head>
<body>
</body>
</html>
위 소스를 보면 $message변수에 hello 값을 넣고 각각 익명 함수로 $example1과 $example2를 만들었습니다.
$example1에서는 $message를 사용하면 에러가 나오는 군요. 에러 내용은 선언되지 않은 변수 사용이라고 나옵니다. $message 변수는 $example1함수 밖에서 선언된 변수이기 때문입니다.
그러나 $example2의 경우는 다릅니다. $message 변수를 사용할 수 있네요.
use 키워드를 사용해서 클로저했기 때문입니다.
링크 - https://www.php.net/manual/en/functions.anonymous.php
링크 - https://www.php.net/closure
여기까지 PHP의 익명 함수(람다식)와 클로져(closure)에 대한 설명이었습니다.
궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.
'Study > PHP' 카테고리의 다른 글
[CakePHP] Request 와 Response (0) | 2019.10.04 |
---|---|
[CakePHP] Ajax요청시 json타입(json_encode) 응답 방법과 view 파일을 선택하는 방법 (0) | 2019.10.01 |
[CakePHP] MVC 프레임워크 Cake를 설치하는 방법 (0) | 2019.10.01 |
[PHP] 자동 require 또는 include되는 함수(spl_autoload_register) (0) | 2019.09.30 |
[PHP] PHP 코딩 영역과 HTML 디자인 영역을 분리 시키는 라이브러리 Smarty (0) | 2019.09.28 |
[PHP] Reflection - Variable편 (0) | 2019.09.27 |
[PHP] Reflection - Method편 (0) | 2019.09.26 |
[PHP] Reflection - Class편 (0) | 2019.09.25 |