【问题标题】:PHPStan: Property with generic class does not specify its types: TKey, TPHPStan:具有泛型类的属性未指定其类型:TKey、T
【发布时间】:2020-08-08 14:38:13
【问题描述】:

我在 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 返回类型)的消息:

具有泛型类Doctrine\Common\Collections\ArrayCollection 的属性App\Entity\Course\Chapter::$slides 未指定其类型:TKey、T
???您可以通过在 phpstan.neon 中设置 checkGenericClassInNonGenericObjectType: false 来关闭此功能。

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

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

【问题讨论】:

  • 下次请在GitHub上提问:github.com/phpstan/phpstan/issues/new/choose
  • @OndřejMirtes 我不想在 GitHub 上打扰你,因为这不是一个错误,但我会记住的(顺便说一句,我经常访问你的 GitHub)。
  • 我将 GitHub 问题视为支持收件箱,所以没关系 :)

标签: generics doctrine static-analysis phpdoc phpstan


【解决方案1】:

ArrayCollection 有两个类型变量:TKey 和 T。所以 ArrayCollection&lt;Slide&gt; 是不够的,你需要像 ArrayCollection&lt;int, Slide&gt; 这样的东西。

【讨论】:

  • 谢谢。我想我明白了,但请确定:int 类型代表外键类型?
  • 我不确定 Doctrine 将什么作为可迭代键类型放在那里,您应该尝试一下。
【解决方案2】:

这是

/**
 * @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

【讨论】:

  • 谢谢,我现在明白了。以前也想看这个帖子,没看懂,现在点击了!打算用泛型重构一些代码
猜你喜欢
  • 2012-07-04
  • 2013-11-22
  • 2016-05-13
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
相关资源
最近更新 更多