0

PHP 中有多种类型提示,现在在 PHP 8 中更多,在 Psalm 中甚至更多。但是声明类型而不是暗示预期的类型呢?

我有一个interface Collection extends Traversable,我需要声明它是一个可遍历的类型Abc。我怎样才能做到这一点,以便 PHPDoc 或 Psalm 知道当我遍历 my 的实例时Collection,每个元素都是 type Abc

换句话说,我需要在接口级别保证断言将始终通过:

function doWithItems(Collection $items): void
{
    foreach ($items as $item) {
        assert($item instanceof Abc);
    }
}
4

1 回答 1

2

我的代码中没有可用的接口示例(这些可能很难正确处理),但是由于 Psalm 在 Traversable 上实现了interface Traversable<TKey, TValue>模板,因此它将类似于:

/**
 * @extends Traversable<array-key,Abc>
 */
interface Collection extends Traversable

我的代码中使用Doctrine Collections的绝对工作类级别的示例(它具有非常全面的 Psalm 支持,您可以查看源代码以了解它们是如何做到的):

/**
 * @extends ArrayCollection<array-key, ShowInterface>
 */
final class Shows extends ArrayCollection
于 2021-01-11T12:05:18.060 回答