>백엔드 개발 >PHP 튜토리얼 >PHP에서 객체의 클로저 속성을 직접 호출할 수 없는 이유는 무엇이며 어떻게 해결할 수 있습니까?

PHP에서 객체의 클로저 속성을 직접 호출할 수 없는 이유는 무엇이며 어떻게 해결할 수 있습니까?

DDD
DDD원래의
2024-12-17 18:30:10296검색

Why Can't I Directly Call an Object's Closure Property in PHP, and How Can I Fix It?

객체 속성 클로저 직접 호출

객체의 속성에 클로저를 할당할 때 클로저를 다시 할당하지 않고 직접 호출하는 데 어려움을 겪을 수 있습니다. 변수. 다음 예를 고려하십시오.

$obj = new stdClass();
$obj->callback = function() {
    print "HelloWorld!";
};

안타깝게도 $obj->callback()을 호출하려고 하면 "치명적인 오류: 정의되지 않은 메서드 stdClass::callback() 호출" 오류가 발생합니다.

PHP 7 솔루션

PHP 7에서는 화살표를 사용하여 함수(PHP 7.4에 도입됨)를 사용하면 다음과 같이 객체의 속성에 할당된 클로저를 직접 호출할 수 있습니다:

$obj = new StdClass;
$obj->fn = function($arg) { return "Hello $arg"; };
echo ($obj->fn)('World');

Closure::call()

For 7 이하의 PHP 버전에서는 Closure::call() 함수를 사용하는 것이 대안입니다. 그러나 이 메서드는 StdClass 인스턴스에는 적용되지 않습니다.

Magic __call 메서드

PHP 7 이전에는 가로채기를 허용하는 Magic __call 메서드를 구현하는 것이 실행 가능한 접근 방식이었습니다. 정의되지 않은 메서드를 호출합니다. 다음 예에서는 __call 구현을 통해 Foo 클래스가 생성됩니다.

class Foo
{
    public function __call($method, $args)
    {
        if(is_callable(array($this, $method))) {
            return call_user_func_array($this->$method, $args);
        }
        // else throw exception
    }
}

$foo = new Foo;
$foo->cb = function($who) { return "Hello $who"; };
echo $foo->cb('World');

__call 구현은 __call 본문 내에서 동일한 메서드가 호출되는 것을 방지하여 무한 재귀를 방지합니다.

위 내용은 PHP에서 객체의 클로저 속성을 직접 호출할 수 없는 이유는 무엇이며 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.