无效为返回类型

Daa*_*aan 42 php return-type void php-7

我用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
Run Code Online (Sandbox Code Playgroud)

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

<?php

    function foo(): void {

    }

    foo(); 
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sig*_*uza 59

编辑:

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

原帖:

取自wiki.php.net:

未来的工作

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

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

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

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

  • @Siguza NikiC是一名核心PHP开发人员.如果他说PHP 7中没有虚空类型,我会相信他. (13认同)
  • PHP 7中没有void类型.它可能会在7.1中引入. (8认同)
  • 这个的任何来源? (2认同)

Lev*_*son 17

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

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


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

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

在PHP中,不返回任何内容的函数将隐式返回null.这意味着你实际上什么都不会返回*.走这null条路线意味着没有向后兼容性中断,因为它null不是从PHP 7.0开始的有效类/接口/特征名称,并且不添加任何新的密钥或保留字.

*熟悉Zend Engine的人会意识到你什么也不返回,但是如果你没有返回任何你分配的变量将被赋值为null,这使得它们在逻辑上是等价的.


在PHP 7.1中将有一个void伪类型.它在Void Return Type RFC中定义.

我个人对此感到很难过,因为RFC作者此前已"退出"并且我已经选择了RFC.接下来我知道它的建议和讨论,她不会等我提出工会类型,如上所述,这将是无效的对应物.那好吧.

  • 我把它作为一个有用的反应上升,但100%不同意.我同意`void`不是必要的,但它非常**."void"的论证是直截了当的 - 它完成了所说的内容,很明显,它是可读的.确实,你可能能够构造一个空的"返回",但能够明确地说它会产生更多可理解的代码(我总是在5天之后无法理解我自己的代码,更不用说其他代码了).对于简洁/减少指令集的可读性总是如此.对我来说,可读性=可维护性,这是一个很好的权衡恕我直言. (8认同)

acr*_*bat 15

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
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅Andrea FauldsRFC!