53

我正在使用 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类型吗?

4

5 回答 5

74

编辑:

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

原帖:

取自wiki.php.net

未来的工作

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

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

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

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

于 2015-04-22T09:20:16.640 回答
30

voidphp 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
}

有关更多信息,请参阅Andrea Faulds 的 RFC

于 2015-11-12T12:28:23.790 回答
21

编辑:在 PHP 7.1 中有一个void伪类型。它在无效返回类型 RFC中定义。以下是 7.1 之前的答案。


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

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


就个人而言,我认为我们不需要void;我们已经有了null从手册

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

在 PHP 中,不返回任何内容的函数将隐式返回null。这意味着您实际上永远无法返回任何内容*。走这null条路意味着没有向后兼容性中断,因为null从 PHP 7.0 开始将不是有效的类/接口/特征名称,并且不会添加任何新键或保留字。

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

于 2015-05-12T18:10:45.287 回答
3

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

于 2015-04-22T09:17:20.150 回答
2

@BeNice我理解你的意思,无论如何我将列维莫里森的考虑总结为一个关于可持续性的实际问题:作为一种可能的返回类型实际上引入,我们打破了唯一可能的类型是void的假设。nullnull

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

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

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

于 2018-03-24T01:43:30.473 回答