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
이러한 메서드는 없습니다(따라서 Call to undefined 메서드오류).
따라서 fetch 속성 구문을 사용하여 lambda를 가져와 호출해야 합니다.
PHP 7.0 이후, 이 작업을 수행할 수 있습니다.
($obj->lambda)()
:($obj->lambda)();
괄호는 PHP가 해석하는 것을 보증합니다.
($obj->lambda)
lamda라는 속성을 가져옵니다.그리고나서,()
는 속성을 가져온 결과를 호출합니다.또는 이 작업을
->lambda->__invoke()
:$myInstance = new MyClass(); $myInstance->lambda->__invoke();
__invoke
PHP의 마법 메서드 중 하나입니다.오브젝트가 이 메서드를 구현하면 오브젝트는 호출할 수 없게 됩니다.$var()
구문을 사용합니다.어나니머스 함수는 를 구현한 인스턴스입니다.__invoke
.또는 로컬 변수에 할당합니다.
$lambda = $myInstance->lambda; $lambda();
또는 call_user_func를 사용하여 호출합니다.
call_user_func($myInstance->lambda);
call_user_func
는, 어나니머스 함수를 포함한 임의의 콜을 실시할 수 있습니다.또는 이것이 코드의 일반적인 패턴일 경우,
__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();
반사를 사용하여 클래스의 항목을 변경하지 않고 람다 함수를 호출할 수도 있습니다.기능.
$myInstance = new MyClass(); $lambda = new ReflectionFunction($myInstance->lambda); $lambda->invoke();
또는 인수를 통과해야 할 경우
$args = array('arg'=>'value'); $lambda->invokeArgs($args);