2013-05-28 3 views
1

최근 다음과 같은 문제가 발생했습니다. 이것은 문제가 발생한 간단한 예입니다. 이 코드를 실행하면개체 참조에서 __invoke 동작이 손실되었습니다.

class a{ 
    public function __invoke($classname){ 
     return new $classname($this); 
    } 
} 
class b{ 
    private $obj; 
    public function __construct($obj){ 
     $this->obj = $obj; 
    } 
    public function getC(){ 
     return $this->obj('c'); 
    } 
} 
class c{} 

$a = new a; 
$a('b')->getC(); 

, 나는 다음과 같은 오류 __invoke의 동작이 줄

return $this->obj('c'); 

그것의 사실 여부에 객체 참조 잃은 것 같다

Fatal error: Call to undefined method b::obj()

를 얻을 그 큰 문제는 내가 이렇게 할 수 있기 때문에.

return $this->obj->__invoke('c'); 

..하지만 __invoke가 예상대로 작동하지 않는 이유를 알고 싶습니다. 아무도 나에게 이것을 설명 할 수 있을까? 미리 감사드립니다!

답변

2

내 생각에 PHP의 함수와 객체는 여전히 똑같이 취급되지 않기 때문에 (PHP 최신 버전이 이것을 고치려고했지만) 나는 $this->obj()에있는 obj을 객체로 취급하지 못하게하는 언어 제한이 있다고 의심합니다. (그 구문은 일반적으로 메소드를 참조하기 때문에) 대신 클래스에 의해 노출 된 메소드 만 검사합니다.

나는 그것을 테스트하지했습니다

하지만,이 작업을 수 있습니다

$obj = $this->obj; 
return $obj('c'); 

물론, 이상적으로, $this->obj는이 클래스의 필드 또는 클래스에 의해 정의 된 메소드의 여부를 객체로 액세스 할 수 있어야합니다. 이런 식으로, 처음에는 구별 할 필요가 없기 때문에 문법에 모호함이 있지만 PHP는 이와 같이 작동하지 않습니다.

+0

답변 주셔서 감사합니다. 실제로 작동합니다! – sofl