클로저 메서드

클로저는 몇 개의 특수 메서드를 지원합니다. 클로저는 __invoke() 외 bindTo() 등 특수 메서드가 있습니다. 특수 메서드를 통해 클로저를 좀 더 세부적으로 설정 및 접근이 가능합니다.

PHP 클로저는 다음과 같은 클래스 인터페이스를 지원합니다.

  • Traversable
  • Iterator
  • IteratorAggregate
  • Throwable
  • ArrayAccess
  • Serializable
  • Closure
  • Generator



bindTo()

새로운 바운드 객체와 클래스 범위로 클로저를 복제 합니다.

bindTo() 메서드는 클로저 객체의 내부 상태를 다른 객체에 연결합니다. 연결되는 객체는 protected와 private 멤버 변수에 접근할 수 있습니다.

예제파일 : closure-03.php

<?php

class A {

    function __construct($val) {
        $this->val = $val;
    }

    function getClosure() {
        // 클로저를 반환합니다. 
// returns closure bound to this object and scope
        return function() { return $this->val; };
    }
}

// $obj1, $obj2 클래스 인스턴스를 생성합니다.
$ob1 = new A(1);
$ob2 = new A(2);

// getClosure() 메서드를 호출하여 클로저를 반환받습니다.
$closure = $ob1->getClosure();
echo $closure(), "\n";

$closure = $closure->bindTo($ob2);
echo $closure(), "\n";

?>

결과

1
2



bind()

특정 바인딩된 객체와 클래스 범위와 클로저를 복제합니다.



__construct

생성자는 인스턴스를 허용하지 않습니다.



call

Closure::call() 메서드는 php 7.x에서 업그레이드로 추가되었습니다. Closure::call()는 더 효율적입니다.

예제파일 : closure-04.php

<?php
class A {
	private $x = 1;
}

// Pre PHP 7 code
$getXCB = function() {
	return $this->x;
};

// intermediate closure
$getX = $getXCB->bindTo(new A, 'A'); 
echo $getX();


// PHP 7+ code
$getX = function() {
	return $this->x;
};
echo $getX->call(new A);
// 기존 bindTo를 사용하던 것을 call로 처리할 수 있다.

?>

위의 예제를 실행을 하면 다음과 같이 출력됩니다.

1
1

PSR-2 코딩 스타일: 클로저
클로저를 작성할 때는 PSR 코딩 스타일 권고로 작성을 하는 것이 다수의 개발자들과 소스를 공유할 때 매우 유용합니다.

클로저는 function 키워드 뒤의 공백과 use 키워드 앞뒤 공백으로 반드시 선언해야 합니다. 또한 본체의 시작하는 중괄호 { 기호는 같은 줄에 작성합니다. 본체의 끝을 표기하는 중괄호 닫기 } 기호는 반드시 다음 줄에 작성합니다.

매개변수를 전달하는 소괄호를 사용합니다. 소괄호 시작 부분과 매개변수 사이에는 공백을 추가하지 않으며, 여러 매개변수를 사용하는 경우에 콤마(,) 다음에 하나의 공백을 두고 다음 변수를 적어 줍니다. 소괄호 마지막에는 매개변수와 소괄호 끝부분 사이에 공백을 추가하지 않습니다.

클로저 선언은 다음과 같습니다. 괄호, 쉼표, 공백 및 중괄호의 배치에 유의해야 합니다. 다음은 PSR 공식 사이트의 예제입니다.

<?php
$closureWithArgs = function ($arg1, $arg2) {
    // body
};

$closureWithArgsAndVars = function ($arg1, $arg2) use ($var1, $var2) {
    // body
};

매개변수는 여러 줄로 나눠서 작성할 수 있습니다. 하지만 각각 한 줄에 한 개로 작성을 하며 들여쓰기를 합니다. 여러 줄로 매개변수를 나열할 때는 소괄호 시작 기호 ‘(’ 다음 줄에서 시작하며 끝낼 때의 종료 기호 ‘)’도 다음 줄에 작성합니다.

다음 예제 표현은 다수의 줄로 매개변수를 표시하는 방법입니다. 다음은 PSR 공식 사이트의 예제입니다.

<?php
$longArgs_noVars = function (
    $longArgument,
    $longerArgument,
    $muchLongerArgument
) {
    // body
};

$noArgs_longVars = function () use (
    $longVar1,
    $longerVar2,
    $muchLongerVar3
) {
    // body
};

$longArgs_longVars = function (
    $longArgument,
    $longerArgument,
    $muchLongerArgument
) use (
    $longVar1,
    $longerVar2,
    $muchLongerVar3
) {
    // body
};

$longArgs_shortVars = function (
    $longArgument,
    $longerArgument,
    $muchLongerArgument
) use ($var1) {
    // body
};

$shortArgs_longVars = function ($arg) use (
    $longVar1,
    $longerVar2,
    $muchLongerVar3
) {
    // body
};

PSR 형식 지정 및 규칙은 함수 또는 메서드 호출에서 클로저가 인수로 직접 사용될 때도 같이 적용됩니다. 다음은 PSR 공식 사이트의 예제입니다.

<?php
$foo->bar(
    $arg1,
    function ($arg2) use ($var1) {
        // body
    },
    $arg3
);