【问题标题】:How To Declare Traversable Type?如何声明可遍历类型?
【发布时间】:2021-04-13 22:38:55
【问题描述】:

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

我有一个interface Collection extends Traversable,我需要声明它是Abc 类型的可遍历。我该怎么做才能让 PHPDoc 或 Psalm 知道当我遍历 Collection 的实例时,每个元素的类型都是 Abc

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

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

【问题讨论】:

    标签: php types phpdoc psalm-php


    【解决方案1】:

    我的代码中没有可用的接口示例(这些可能很难正确处理),但由于 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
    

    【讨论】:

      猜你喜欢
      • 2012-07-03
      • 1970-01-01
      • 2012-02-15
      • 1970-01-01
      • 2020-11-14
      • 2013-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多