我喜欢在PHP7中键入hint或开始实际显示getter函数的返回值。但对于Doctrine/Symfony中的一对多关系,我仍然被卡住了,不确定该在@var
标签中添加什么。
[...]
/**
* @var string
* @ORMColumn(name="name", type="string")
*/
private $features;
/**
* What goes into var here?
*
* One Product has Many Features.
* @ORMOneToMany(targetEntity="Feature", mappedBy="product")
*/
private $features;
public function __construct()
{
$this->features = new ArrayCollection();
$this->name = 'New Product Name';
}
/**
* @return Collection
*/
public function getFeatures(): Collection
{
return $this->features;
}
[...]
目前我正在使用@var Collection
,然后可以使用Collection函数。但什么才是回归的"正确"呢?它真的是Collection
吗?还是ArrayCollection
?如果需要的话,我很想使用Features[]
来使用Feature的功能(而不是类型提示),但感觉不对。
什么是"最干净"/稳定的方法?
如果您想保留docblock,我会使用并集类型|
来指定Collection及其包含的值列表,如:
/**
* @var Collection|Feature[]
*/
这样,当您从集合中获得单个对象时,IDE应该既能找到Collection中的方法,也能找到Feature类型提示,例如在foreach中。
至于ArrayCollection与Collection的问题,通常建议为接口键入hint(在本例中为Collection)。ArrayCollection提供了更多的方法,但除非您真的需要它们,否则我不会为了获取它们而使用类型提示。
在项目中,我倾向于将Collection保留在实体中,只在getter中传递一个数组,如下所示:
public function getFeatures(): array
{
return $this->features->toArray();
}
public function setFeatures(array $features): void
{
$this->features = new ArrayCollection($features);
}
请注意,PHP 7.0中还不支持void
返回类型。返回数组的好处是,在您的代码中,您不必担心使用哪种Collection Doctrine。该类主要用于维护Doctrine的工作单元中对象之间的引用,因此它不应该真正成为您关注的一部分。