我想开始使用 Criteria
,但是我有一个非常基本的问题,我找不到任何信息。
假设我有一个具有方法getStudents
的实体。此方法可以返回ArrayCollection
或PersistentCollection
,都具有来自Selectable
接口的matching
方法。问题是,我应该将提示作为getStudents
方法的返回值键入什么?我所看的地方,人们建议将Collection
接口用作类型提示,这两个类都共享,但是此接口不会扩展Selectable
,因此它没有matching
方法!因此看起来有些不一致。
在许多教程中,例如,我们有类似的东西:
public function getExpertScientists()
{
$criteria = Criteria::create()
->andWhere(Criteria::expr()->gt('yearsStudied', 20))
->orderBy(['yearsStudied', 'DESC']);
return $this->getGenusScientists()->matching($criteria);
}
但是,如果$this->getGenusScientists()
是类型提示没有匹配方法的Collection
,它将在我的IDE中产生警告,感觉就像是错误的。
您如何处理?除了忽略IDE警告或键入我们的Getter可以返回的所有内容之外,我们还有其他选择(例如:@return ArrayCollection|PersistentCollection
(?
不确定其他IDE,所以我会为phpstorm回答。
我一直在使用 @return Collection|Selectable
,而且效果很好。如果该方法返回,例如Student
实体,您也可以将其键入。 @return Collection|Selectable|Student[]
因此,IDE了解两个学说的收集内容,但是如果您以后迭代或访问单个元素,它也可以键入Student
方法。
当然,在语义上它没有多大意义,因为您会期望像@return Collection&Selectable&Student[]
这样的东西,因为您正在返回相交类型而不是联合类型。
以及从phpstorm版本2018.3,您实际上甚至可以使用相交类型(请参阅此更新(,因此@return Collection&Selectable&Student[]
可以帮助您区分代码中的实际联合和相交类型。