클래스 변수 인 클로저를 호출하는 방법은 무엇입니까?
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();
__invoke
PHP의 마법 방법 중 하나입니다 . 객체가이 메서드를 구현하면 호출 가능하게됩니다$var()
. 구문을 사용하여 호출 할 수 있습니다 . 익명 함수의 인스턴스Closure
있는 구현,__invoke
.또는 지역 변수에 할당합니다.
$lambda = $myInstance->lambda; $lambda();
또는 call_user_func를 사용하여 호출합니다.
call_user_func($myInstance->lambda);
call_user_func
callable
익명 함수를 포함하여 모든을 호출 할 수 있습니다 .또는 이것이 코드에서 일반적인 패턴 인 경우
__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
'Development Tip' 카테고리의 다른 글
s3cmd를 사용하여 한 S3 버킷에서 다른 버킷으로 모든 파일을 복사 할 수 있습니까? (0) | 2020.10.20 |
---|---|
UIImage를 축소하고 흐릿하게 만드는 대신 동시에 파삭 파삭하고 선명하게 만드는 방법은 무엇입니까? (0) | 2020.10.20 |
실행 시간이없는 루프 (0) | 2020.10.20 |
페이드 인 및 추가 사용 (0) | 2020.10.20 |
핀을 건드리지 않고 MKAnnotationView의 콜 아웃 뷰를 트리거하는 방법은 무엇입니까? (0) | 2020.10.20 |