【问题标题】:Void as return typevoid 作为返回类型
【发布时间】:2015-06-29 19:57:06
【问题描述】:

我正在使用 PHP 7 测试返回类型。

我创建了一个简单的脚本来测试 PHP 7 的返回类型:

<?php

Class Obj {

    public function __construct(){

    }

    public function test(): string { //a string needs to be returned
        return "ok";
    }

}

function foo(): Obj { //instance of Obj needs to be returned
    return new Obj();
}

$o = foo();
echo $o->test(); // output: ok

现在在其他编程语言中,当您指定返回类型 void 时,这意味着您无法返回任何内容,否则您将收到错误消息。所以我写了这个脚本:

<?php

    function foo(): void {

    }

    foo(); 

现在在上面的脚本中,预期的输出什么都没有。 相反,它给了我一个致命错误:

致命错误:foo() 的返回值必须是 void 的实例,第 2 行没有返回

我的问题是(我找不到),在 PHP 7 中会有类似的void 类型吗?

【问题讨论】:

标签: php void return-type php-7


【解决方案1】:

编辑:

针对 void return type 的新单独 RFC 已发布,已通过投票,并在 PHP 7.1 中实现。
PHP 现在有一个void 返回类型。 :)

原帖:

取自wiki.php.net

未来工作

超出本 RFC 范围的未来工作想法包括:

  • 允许函数声明它们根本不返回任何内容(Java 和 C 中为 void)

所以目前没有办法声明您不返回任何东西。
我不知道在你的情况下什么是最好的,但我可能只是暂时不声明返回类型。

要回答您的问题,PHP 7 中是否会有 void 返回类型:
目前还没有保证,但我认为void或同义词很可能会以某种方式实现。

【讨论】:

  • PHP 7 中不会有 void 类型。它可能会在 7.1 中引入。
  • @Siguza NikiC 是一名核心 PHP 开发人员。如果他说 PHP 7 中不会有 void 类型,我会相信他。
【解决方案2】:

voidreturn 类型已被 php 7.1 接受。所以它会在未来出现。

一些关于它如何工作的例子:

function should_return_nothing(): void {
    return 1; // Fatal error: A void function must not return a value
}

function returns_null(): void {
    return null; // Fatal error: A void function must not return a value
}
function lacks_return(): void {
    // valid
}
function returns_nothing(): void {
    return; // valid
}

请参阅RFC from Andrea Faulds 了解更多信息!

【讨论】:

  • 它现在似乎可以工作了,我认为他们将它添加到语言中。
  • 其实这很酷,因为如果你在返回类型被声明为 void 时尝试返回某些东西,即使 linter 现在也会抱怨。
【解决方案3】:

编辑:在 PHP 7.1 中有一个 void 伪类型。它在Void Return Type RFC 中定义。以下是 7.1 之前的答案。


此处返回类型 RFC 的作者。在 PHP 7.0 中不会有 void 返回类型,因为 the RFC 没有添加它,任何其他针对 PHP 7.0 的 RFC 也没有添加它。

void 类型可以存在于 PHP 7 系列中,如果我们决定添加新的键/保留字对于次要版本是可以的,即使它们会破坏代码。这有点不确定,但它是在 PHP 5.4 中使用 callable 关键字完成的。


我个人认为我们不需要void;我们已经有nullFrom the manual:

特殊的 NULL 值表示一个没有值的变量。 NULL 是 null 类型唯一可能的值。

在 PHP 中,不返回任何内容的函数将隐式返回 null。这意味着您永远实际上什么都不返回*。走null 路线意味着自null will not be a valid class/interface/trait name starting in PHP 7.0 以来没有向后兼容性中断,并且不会添加任何新键或保留字。

*熟悉 Zend 引擎的人会意识到您可以不返回任何内容,但如果您不返回任何内容,您分配的变量将被分配为 null,这使得它们在逻辑上是等价的。

【讨论】:

  • 我认为这是一个有用的回应,但 100% 不同意。我同意void 不是必需的,但它是非常可取的。 void 的论点直截了当——它做到了所说的,很清楚,它是可读的。诚然,您可能能够构建一个无效的“回报”,但能够明确地说出它会产生更易于理解的代码(我总是在 5 天后无法理解自己的代码,更不用说其他人的代码了)。总是有这样的推动简洁/减少指令集的可读性。对我来说,可读性 = 可维护性,恕我直言,这是一个很好的权衡。
【解决方案4】:

php 中没有 void 的等价类型, 返回空值;可能符合您的要求,因为它没有任何类型,如 0 或任何其他值。注意:实际无效意味着没有回报。

【讨论】:

    【解决方案5】:

    @BeNice 我理解你的意思,无论如何我总结了从 Levi Morrison 作为可持续性的一个实际问题:引入void 作为可能的返回类型事实上,我们打破了null 唯一可能的类型是null 的假设。

    这样,void 应该返回用于null 的类型检查,通过设计更改架构约束并导致向后兼容性混乱。

    // your choice implies this comparison should be true:
    gettype(null) === void;
    

    我认为在他的代码中不经常使用null 的人会承担void 类型的实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-30
      • 2015-03-24
      • 2017-02-28
      • 2016-08-16
      • 2011-04-08
      • 2013-02-24
      • 1970-01-01
      相关资源
      最近更新 更多