PHPStan(级别9+)标记工厂makeCollection返回类型异常的原因及修正方法
解决PHPStan级别9+下工厂方法返回类型的泛型兼容问题
PHPStan在级别9+的严格模式下,对泛型和返回类型协变的检查会更严苛。你遇到的问题核心是:CollectionFactory的makeCollection方法声明返回CollectionInterface,但实际返回Collection实例时,PHPStan无法自动识别泛型的匹配关系,因此标记异常。
以下是两种可行的修正方案:
方案一:明确注解返回的具体泛型类
保持方法的返回类型声明为CollectionInterface,在注解里明确返回带泛型参数的具体实现类,让PHPStan识别两者的兼容性:
/** * @template ElementType * @implements CollectionFactoryInterface<ElementType> */ class CollectionFactory implements CollectionFactoryInterface { /** * @return Collection<ElementType> */ public function makeCollection(): CollectionInterface { return new Collection(); } }
方案二:利用返回类型协变优化声明
PHP支持返回类型协变(子类方法可返回比接口更具体的类型),直接将方法的返回类型声明为Collection,同时更新注解:
/** * @template ElementType * @implements CollectionFactoryInterface<ElementType> */ class CollectionFactory implements CollectionFactoryInterface { /** * @return Collection<ElementType> */ public function makeCollection(): Collection { return new Collection(); } }
这两种方案都能让工厂类的makeCollection方法既符合CollectionFactoryInterface的契约,又能被PHPStan正确识别泛型类型,消除报错。
内容的提问来源于stack exchange,提问作者Doug Wilbourne
相关产品推荐
相关产品推荐

