[PHP] PHP의 익명 함수(람다식)와 클로져(closure)


Study/PHP  2019. 9. 29. 09:00

안녕하세요. 명월입니다.


이 글은 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)에 대한 설명이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.