返回类型为Void

60

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


2
答案是已经有人提出了,但并没有进展太多...而且很可能会像标量类型提示一样引起分歧的投票:https://philsturgeon.uk/php/2015/02/15/php-void-much-ado-about-nothing/ - Mark Baker
现在似乎可以工作了。我认为他们将其添加到语言中了。现在,如果在声明返回类型为void时返回了某些内容,即使是linter也会抱怨。 - still_dreaming_1
https://phil.tech/php/2015/02/15/php-void-much-ado-about-nothing/ 这是新链接。 - Theodore R. Smith
就此而言,JavaScript具有nullundefined作为特殊值。undefined并不意味着未定义。它是已声明但尚未赋值的变量的默认值,或者是函数的默认返回值。然而,你也可以有意地将其赋值给一个变量。真正的问题是,大多数JavaScript开发人员无法告诉你何时可以将其用作null的替代选择。 - undefined
5个回答

85

编辑:

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

原帖:

来自wiki.php.net:

未来的工作

此 RFC 范围之外的未来工作想法包括:

  • 允许函数声明它们根本不返回任何东西(Java 和 C 中的 void)

因此目前没有办法声明您不返回任何内容。
我不知道在您的情况下什么是最好的选择,但我可能会暂时不声明返回类型。

关于您是否可以在 PHP 7 中使用 void 返回类型的问题:
尚未保证,但我认为很有可能以某种方式实现 void 或其同义词。


9
PHP 7 中将不会有 void 类型。它可能会在 7.1 版本中引入。 - NikiC
17
@Siguza NikiC是PHP的核心开发人员。如果他说PHP 7中不会有void类型,我会相信他。 - mpen

37

void返回类型已被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
}

查看Andrea Faulds的RFC了解更多信息!


1
看起来现在可以工作了,我认为他们把它加入到语言中了。 - still_dreaming_1
实际上这很酷,因为即使 linter 现在会抱怨如果你尝试返回一个声明为 void 的返回类型。 - still_dreaming_1

23

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


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

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


就我个人而言,我认为我们不需要void;我们已经拥有null了。从手册中可以看到:

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

在PHP中,一个不返回任何内容的函数将隐式地返回null。这意味着你永远不能实际上返回nothing。采用null的方式意味着没有向后兼容性的破坏,因为从PHP 7.0开始,null将不是有效的类/接口/特征名称,并且不添加任何新的关键字或保留字。

*熟悉Zend Engine的人会意识到,你可以返回nothing,但如果你返回了nothing,那么你分配的变量将被分配为null,这使它们在逻辑上等价。


11
我认为这是一个有用的回复,但我100%不同意。我同意void是不必要的,但它非常理想。支持void的论点很简单——它做到了它所说的事情,它清晰易懂。当然,你可能能够构建一个void“返回”,但是能够明确地表示它会产生更易理解的代码(我一直都很难在5天后理解自己的代码,更别说别人的了)。总是强调简洁性/指令集的缩减,而不是可读性。对我来说,可读性=可维护性,这是一个很好的权衡,我个人认为。 - BeNice

3

在php中,没有与void等价的类型, 使用return NULL;可能符合您的要求,因为它没有像0或任何其他值那样的类型。注意:实际的void意味着没有返回。


2

@BeNice,我理解你的观点。但是,Levi Morrison提出了一个关于可持续性的实际问题:将void作为可能的返回类型引入,事实上,我们打破了只有null是可能类型的假设。

这样一来,应该返回void以进行null的类型检查,通过设计改变架构限制,导致向后兼容性混乱。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接