클래스 변수인 마감을 어떻게 호출합니까?

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);