1

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

しかし、それは醜いことでもあり、さらに悪いことに、これはおもちゃの例です。実際のクラスでは、多くのメソッドを再実装する必要があります。ひどい。

4

1 に答える 1