无效返回类型

时间:2015-04-22 09:12:16

标签: php void return-type 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

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

<?php

    function foo(): void {

    }

    foo(); 

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

  

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

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

5 个答案:

答案 0 :(得分:56)

编辑:

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

原帖:

取自wiki.php.net

  

未来工作

     

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

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

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

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

答案 1 :(得分:17)

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

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

就个人而言,我认为我们不需要void;我们已经null了。 From the manual

  

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

在PHP中,不返回任何内容的函数将隐式返回null。这意味着你不能实际什么也不返回*。转到null路由意味着自null will not be a valid class/interface/trait name starting in PHP 7.0以来没有向后兼容性中断,并且不添加任何新密钥或保留字。

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

在PHP 7.1中,将存在void伪类型。它在Void Return Type RFC

中定义

就我个人而言,我很难过,因为RFC作者之前曾“退出”并且我已经选择了RFC。接下来我知道它的建议和讨论,她不会等我提出工会类型,如上所述,这将是无效的对应物。哦,好吧。

答案 2 :(得分:13)

php 7.1接受void返回类型。所以它将来会出现。

有关它如何运作的一些例子:

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

@BeNice我理解你的观点,无论如何我总结了这个考虑因素 Levi Morrison作为可持续性的实际问题:引入void作为可能的返回类型,我们打破了唯一可能的null类型为null的假设。

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

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

我认为谁在代码中不经常使用null会带有void类型的实现。