【问题标题】:Why does PhpStorm allow for null return type on function using yield?为什么 PhpStorm 允许使用 yield 的函数返回 null 类型?
【发布时间】:2019-03-14 09:22:30
【问题描述】:

我使用 PhpStorm 在下面的函数中自动添加返回类型:

/**
 * @return \Generator|null
 */
function yieldTest(): ?\Generator
{
    yield from [1, 2, 3];
}

我的问题:为什么在\Generator 旁边添加null 选项?

我看不到返回 null 的方法,所以我想知道我是否忽略了 yield 工作方式的某些内容,或者这是否是 PhpStorm 方面的一个怪癖并且可以安全地放弃?

更新:

澄清一下 - 我在问为什么 PHPStorm 生成的返回类型为 ?\Generator

我知道它随后将 null 添加到 php 文档 @return 标记中,因为在 ? 上。

更新 2:

这是生成额外位之前的测试文件的完整代码:

class yieldTestClass
{
    public function yieldTest()
    {
        yield from [1, 2, 3];
    }
}

这是从方法名称的上下文菜单中选择“声明返回类型”后的代码:

class yieldTestClass
{
    public function yieldTest(): ?\Generator
    {
        yield from [1, 2, 3];
    }
}

我不确定这是 IDE 中的本机功能还是来自插件,但如果是插件,我猜它会是 https://plugins.jetbrains.com/plugin/7622-php-inspections-ea-extended-

不管怎样,同样的问题。

【问题讨论】:

  • @AbcAeffchen 如果您直接调用它,它只会不断返回完整的\Generator 实例。如果您在事先检查完结果集后将其粘贴到 foreach 或其他任何内容中,它只会自动倒带。所以总的来说,我没有设法让它以我能想到的任何方式返回 null。
  • 请在生成类型之前提供代码,以便任何人都可以在本地环境中尝试。也许不是 PhpStorm 做到了(而是其他一些插件,不是捆绑的)。为此,需要初始代码示例(所以我们都检查相同)。理想情况下是整个文件内容(以防它依赖于其他内容)。
  • 好声,前后添加,以确保清晰@LazyOne

标签: php phpstorm


【解决方案1】:

? 表示“返回类型声明不是强制性的,理论上可以省略”。如果你真的返回null,PHPStorm不会做动态分析。

从 PHP 7.1.0 开始,可以通过前缀将返回值标记为可为空 带有问号 (?) 的类型名称。这意味着 函数返回指定类型或 NULL。

参考:http://php.net/manual/en/functions.returning-values.php

考虑代码示例:

    /**
     * @return Generator|null
     */
    function yieldTest(): ?\Generator
    {
        yield from [1, 2, 3];
    }

    /**
     * @return Generator
     */
    function yieldTest(): \Generator
    {
        yield from [1, 2, 3];
    }

【讨论】:

  • 感谢您的回答,但我知道 php 文档类型提示包含 null,因为 ?。问题是 PHPStorm 生成了这个位 : ?\Generator,所以 it 添加了 ?,这就是我想知道的部分。如果不完全清楚,我会更新我的问题。
  • @Bananaapple 你的问题和以前一样好,现在就像你在问为什么 phpstorm 默认有这个设置,这使得它在 Stack Overflow 上偏离主题,因为它不是关于编程而是如何您使用了一个工具(在 Superuser SE 上会询问)。
  • 我想一个更好的问题应该是使用 yield 的方法的正确返回类型应该是什么以及它是否可以为 null - 从而消除了问题中不确定的 IDE 元素。
【解决方案2】:

该检查和预期修复(添加的代码)由 Php 检查(EA 扩展)插件提供。

请向插件作者报告:https://github.com/kalessil/phpinspectionsea/issues

【讨论】:

  • 好吧,所以要明确一点 - 这是插件中的一个错误,yield 确实无法在此处实际提出null
  • 我很少使用生成器,所以不能给你一个 100% 的答案。即使你使用yield ;yield from null; 之类的东西,它仍然是一个Generator 实例。
  • 刚刚注意到,如果您使用 PHPStorm 生成 PHP 文档 @return 标签 before 使用插件生成返回类型,您实际上会得到 @return \Generator 而没有 @ 的选项987654328@ 因此,鉴于此以及其他所有内容,我认为我们正在寻找插件中的错误。
猜你喜欢
  • 2021-12-15
  • 1970-01-01
  • 2019-12-16
  • 2015-09-28
  • 2021-05-02
  • 2017-07-27
  • 2020-05-26
  • 2016-07-25
  • 1970-01-01
相关资源
最近更新 更多