PHPStan:具有泛型类的属性未指定其类型:TKey、T

Aym*_*Dev 7 generics doctrine static-analysis phpdoc phpstan

我在一个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;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Ond*_*tes 18

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


Tho*_*uer 6

它是

\n
/**\n * @var ArrayCollection<int, Slide>\n */\n
Run Code Online (Sandbox Code Playgroud)\n

dump()对父实体执行操作显示它$slides是一个 0 索引数组:

\n
0 => App\\Entity\\Slide\n1 => App\\Entity\\Slide\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n