phpstan
このサンプル コードで生成されたエラーを修正する正しい方法は何ですか? エラーメッセージは次のとおりです。
Method Foo::foo() should return Child but returns Base.
<?php declare(strict_types = 1);
Interface MyI {abstract function a(): self;}
Class Base implements MyI {
public function a(): self {return $this;}
}
Class Child extends Base {
public function c(): self {return $this;}
}
Class Foo {
public function factory(): Child {return new Child();}
/**
* @return Child
*/
public function foo() /* note no return type */ {
return $this->factory()
->c()
->a();
}
}
エラーを解消する 1 つの方法は、次のように変更する@return
ことです。
/**
* @return Child | Base
*/
foo()
しかし、のインスタンスを決して返さないため、私はそれを大いに嫌いますBase
。コードは、派生クラスでのみ機能しChild
ます。実際、インターフェイスと基本クラスはどちらもライブラリ (依存関係) にあるため、ほとんどの場合、そのコードを変更することさえできません。
a()
次のようにChild
クラスに再実装できます。
public function a(): Child {
parent::a();
return $this;
}
しかし、それは醜いことでもあり、さらに悪いことに、これはおもちゃの例です。実際のクラスでは、多くのメソッドを再実装する必要があります。ひどい。