Development Tip

클래스 변수 인 클로저를 호출하는 방법은 무엇입니까?

yourdevel 2020. 10. 20. 08:15
반응형

클래스 변수 인 클로저를 호출하는 방법은 무엇입니까?


class MyClass {
  var $lambda;
  function __construct() {
    $this->lambda = function() {echo 'hello world';};
    // no errors here, so I assume that this is legal
  }
}

$myInstance = new MyClass();
$myInstance->lambda();
//Fatal error: Call to undefined method MyClass::lambda()

그렇다면 클래스 변수에 도달하기위한 올바른 구문은 무엇입니까?


PHP에서 메서드와 속성은 별도의 네임 스페이스에 있으며 (동일한 이름을 가진 메서드와 속성을 가질 수 있음) 속성 또는 메서드에 액세스하는지 여부는 액세스하는 데 사용하는 구문에 따라 다릅니다.

$expr->something()메서드 호출이므로 PHP는 something클래스의 메서드 목록에서 검색 합니다.

$expr->something속성 가져 오기이므로 PHP는 something클래스의 속성 목록에서 검색 합니다.

$myInstance->lambda();메서드 호출로 구문 분석되므로 PHP lambda는 클래스에서 명명 메서드를 검색 하지만 그러한 메서드는 없습니다 (따라서 정의되지 않은 메서드 호출 오류).

따라서 fetch 속성 구문 을 사용 하여 람다를 가져온 다음 호출해야합니다.

  • PHP 7.0부터 다음과 ($obj->lambda)()같이 할 수 있습니다 .

    ($obj->lambda)();
    

    괄호는 PHP가 lambda라는 속성($obj->lambda)가져올 때 구문 분석 하도록합니다 . 그런 다음 ()속성을 가져온 결과를 호출합니다.

  • 또는 다음과 ->lambda->__invoke()같이 할 수 있습니다 .

    $myInstance = new MyClass();
    $myInstance->lambda->__invoke();
    

    __invokePHP의 마법 방법 중 하나입니다 . 객체가이 메서드를 구현하면 호출 가능하게됩니다 $var(). 구문을 사용하여 호출 할 수 있습니다 . 익명 함수의 인스턴스 Closure있는 구현, __invoke.

  • 또는 지역 변수에 할당합니다.

    $lambda = $myInstance->lambda;
    $lambda();
    
  • 또는 call_user_func를 사용하여 호출합니다.

    call_user_func($myInstance->lambda);
    

    call_user_funccallable익명 함수를 포함하여 모든을 호출 할 수 있습니다 .

  • 또는 이것이 코드에서 일반적인 패턴 인 경우 __call호출을 람다로 전달 하는 메서드를 설정할 수 있습니다 .

    class MyClass
    {
        private $lambda;
    
        public function __construct()
        {
            $this->lambda = function() {
                echo "Hello world!\n";
            };
        }
    
        public function __call($name, $args)
        {
            return call_user_func_array($this->$name, $args);
        }
    }
    

    이제 작동합니다.

    $myInstance = new MyClass();
    $myInstance->lambda();
    

    PHP 5.4부터는 특성으로도 할 수 있습니다.

    trait LambdasAsMethods
    {
        public function __call($name, $args)
        {
            return call_user_func_array($this->$name, $args);
        }
    }
    
    class MyClass
    {
        use LambdasAsMethods;
    
        private $lambda;
    
        public function __construct()
        {
            $this->lambda = function() {
                echo "Hello World!\n";
            };
        }
    }
    
    $myInstance = new MyClass();
    $myInstance->lambda();
    

ReflectionFunction을 사용하여 클래스에서 변경하지 않고 람다 함수를 호출 할 수도 있습니다.

$myInstance = new MyClass();
$lambda = new ReflectionFunction($myInstance->lambda);
$lambda->invoke();

또는 인수를 전달해야하는 경우

$args = array('arg'=>'value');
$lambda->invokeArgs($args);

참고 URL : https://stackoverflow.com/questions/7067536/how-to-call-a-closure-that-is-a-class-variable

반응형