【问题标题】:How to typehint generators in php?如何在 php 中输入提示生成器?
【发布时间】:2021-10-08 19:09:01
【问题描述】:

假设你有这样一个类:

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,尽管它应该可以工作)。

【问题讨论】:

  • 显然,它可能通过 phpstan 实现,虽然我还不知道如何在 phpstorm 中激活:phpstan.org/blog/generics-in-php-using-phpdocs
  • 在 PhpStorm 中对泛型的支持已在几天前发布的最新版本中添加 - 因此,如果您可以为此使用 PHPDocs(这并不意味着您必须使用 PHPStan,如PhpStorm 和 PHPStan 都只读取该数据),这在更新 PhpStorm 后可能会有所帮助
  • @NicoHaase 最新版本,你是指2021.2还是EAP?因为它在我的 2021.2 机器上似乎不起作用。你能扩展一下吗?
  • @NicoHaase 我发现了这篇博文,虽然它谈到了泛型文档,但我不知道它是否可以应用于生成器以及如何应用。 blog.jetbrains.com/phpstorm/2021/07/phpstorm-2021-2-beta
  • 是的,完全一样?或者喜欢/** @var MyClass[] $generator **/?

标签: php phpstorm generator type-hinting phpdoc


【解决方案1】:

和 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');
};

【讨论】:

    猜你喜欢
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    相关资源
    最近更新 更多