PHPStan: 属性 with generic class does not specify its types: TKey, T

PHPStan: Property with generic class does not specify its types: TKey, T

我 运行 PHPStanSymfony 项目中我在 [=26= 中有以下关系]学说实体:

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

运行 分析 规则级别 6 我收到以下关于 属性 的消息(及其 getter return类型):

Property App\Entity\Course\Chapter::$slides with generic class Doctrine\Common\Collections\ArrayCollection does not specify its types: TKey, T
You can turn this off by setting checkGenericClassInNonGenericObjectType: false in your phpstan.neon.

我的编辑尝试只是让 PHPStan 感到困惑,可能是因为我在这里没有完全理解泛型。但是,仅仅因为我不明白消息而将其静音是愚蠢的。

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

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

这样的东西

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

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

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

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

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