8

我在一个Symfony项目上运行PHPStan ,我在一个Doctrine实体中有以下关系:

/**
 * @ORM\OneToMany(targetEntity="App\Entity\Course\Slide", mappedBy="chapter", cascade={"persist"}, orphanRemoval=true)
 * @ORM\OrderBy({"listOrder" = "ASC"})
 *
 * @var ArrayCollection<Slide>
 */
private $slides;

使用规则级别 6运行分析我收到以下有关该属性(及其 getter 返回类型)的消息:

App\Entity\Course\Chapter::$slides具有泛型类的属性Doctrine\Common\Collections\ArrayCollection未指定其类型:TKey, T
您可以通过checkGenericClassInNonGenericObjectType: falsephpstan.neon.

我的编辑尝试只会混淆 PHPStan,可能是因为我在这里没有完全理解泛型。但是仅仅因为我不明白而使消息静音是愚蠢的。

我应该在 PHPDoc 中添加或更改什么?

4

2 回答 2

19

ArrayCollection有两个类型变量:TKey 和 T。所以ArrayCollection<Slide>还不够,你需要类似ArrayCollection<int, Slide>.

于 2020-04-25T08:34:46.083 回答
5

它是

/**
 * @var ArrayCollection<int, Slide>
 */

对父实体执行dump()操作表明这$slides是一个 0 索引数组:

0 => App\Entity\Slide
1 => App\Entity\Slide

所以它是一个int,但不是实体的 ID(因为它还没有持久化)。

这是 Ondřej Mirtes(=PhpStan 的作者)关于泛型的深入文章:https ://medium.com/@ondrejmirtes/generics-in-php-using-phpdocs-14e7301953

于 2020-10-07T11:11:12.717 回答