如何解决如何声明可遍历类型?
PHP 中有多种类型提示,现在在 PHP 8 中更多,在 Psalm 中更多。但是如何声明类型,而不是暗示预期的类型?
我有一个 interface Collection extends Traversable
,我需要声明它是一个 Abc
类型的可遍历对象。我该怎么做才能让 PHPDoc 或 Psalm 知道当我遍历 Collection
的实例时,每个元素的类型都是 Abc
?
换句话说,我需要在接口级别保证断言总是通过:
function doWithItems(Collection $items): void
{
foreach ($items as $item) {
assert($item instanceof Abc);
}
}
解决方法
我的代码中没有可用的界面示例(这些可能很难正确),但由于 Psalm 在 Traversable 上实现了 interface Traversable<TKey,TValue>
template,所以它会是这样的:
/**
* @extends Traversable<array-key,Abc>
*/
interface Collection extends Traversable
我的代码中使用 Doctrine Collections 的绝对有效的类级别示例(它具有非常全面的 Psalm 支持,您可以查看源代码以了解他们是如何做到的):
/**
* @extends ArrayCollection<array-key,ShowInterface>
*/
final class Shows extends ArrayCollection
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。