首页 > 解决方案 > 如何在 php 中输入提示生成器?

问题描述

假设你有一个像这样的类:

class MyClass
{
    public function __construct(public int $id, public string $foo)
    {
    }
}

和一个生成器创建该类的多个实例,如下所示:

$myGenerator = function (): \Generator {
     yield new MyClass(id: 21, foo: 'fnord');
     yield new MyClass(id: 13, foo: 'baz');
     yield new MyClass(id: 42, foo: 'Thanks for the fish');
};

如何键入提示生成器函数,以便它在迭代期间推断每个元素的类型?

foreach ($myGenerator as $instance) {
    $instance-> // no autocompletion in IDE as type is not known
}

我不想这样做:

foreach ($myGenerator as $instance) {
    /** @var MyClass $instance */
    $instance-> // now autocomplete works inside an IDE
}

因为它会用冗余的类型提示来纠缠生成器的每次使用。我想在生成器的返回类型级别上提供一次。

有没有更好的替代类型提示生成器?

在伪代码中,我希望能够按照以下方式做一些事情:

$myGenerator = function (): \Generator<MyClass> {...}

我假设 php 的类型系统不适合这个,我不介意使用 phpdocs / phpstan。主要用例是 IDE 支持(在我的情况下是 phpStorm,尽管它应该可以工作)。

标签: phpphpstormgeneratortype-hintingphpdoc

解决方案


像 phpdoc 上的其他集合一样

/**
* @return \Generator|MyClass[]
*/
$myGenerator = function (): \Generator {
   yield new MyClass(id: 21, foo: 'fnord');
   yield new MyClass(id: 13, foo: 'baz');
   yield new MyClass(id: 42, foo: 'Thanks for the fish');
};

推荐阅读