업데이트 : PHP 7.4는 이제이 질문에서 제기 된 주요 문제를 해결하는 공분산 및 반공 분산을 지원 합니다.
PHP 7에서 반환 유형 힌팅을 사용하는 데 문제가 발생했습니다. 내 이해는 힌트 : self
가 구현 클래스가 자체적으로 반환하도록 의도한다는 것을 의미한다는 것입니다. 따라서 나는 그것을 : self
나타 내기 위해 인터페이스에서 사용 했지만 실제로 인터페이스를 구현하려고 할 때 호환성 오류가 발생했습니다.
다음은 내가 겪은 문제에 대한 간단한 데모입니다.
interface iFoo
{
public function bar (string $baz) : self;
}
class Foo implements iFoo
{
public function bar (string $baz) : self
{
echo $baz . PHP_EOL;
return $this;
}
}
(new Foo ()) -> bar ("Fred")
-> bar ("Wilma")
-> bar ("Barney")
-> bar ("Betty");
예상 출력은 다음과 같습니다.
프레드 윌마 바니 베티
내가 실제로 얻는 것은 :
PHP 치명적 오류 : Foo 선언 :: bar (int $ baz) : Foo는 iFoo :: bar (int $ baz)와 호환되어야합니다 : 7 행의 test.php의 iFoo
문제는 Foo가 iFoo의 구현이므로 구현이 주어진 인터페이스와 완벽하게 호환되어야한다고 말할 수 있습니다. 아마도 인터페이스 나 구현 클래스 (또는 둘 다)를 변경하여 인터페이스를 사용하는 대신 이름으로 힌트를 반환하여이 문제를 해결할 수 self
있지만, 내 이해는 의미 상 self
"방금 메서드를 호출 한 클래스의 인스턴스를 반환" 을 의미 한다는 것입니다. ". 따라서 인터페이스로 변경하면 이론적으로 호출 된 인스턴스에 대한 의도가 반환 될 때 인터페이스를 구현하는 모든 인스턴스를 반환 할 수 있습니다.
이것은 PHP에 대한 감독입니까, 아니면 의도적 인 설계 결정입니까? 전자의 경우 PHP 7.1에서 수정 된 것을 볼 수 있습니까? 그렇지 않다면 인터페이스가 연결을 위해 방금 호출 한 인스턴스를 반환 할 것으로 예상한다는 것을 암시하는 올바른 반환 방법은 무엇입니까?