返回类型为 void

问题描述 投票:0回答:6

我正在使用 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
6个回答
88
投票

编辑:

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

void
返回类型。 :)

原帖:

取自wiki.php.net

未来的工作

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

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

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

回答你的问题 PHP 7 中是否会有

void
返回类型:
目前还没有 保证,但我认为
void
或同义词很可能会以某种方式实现。


39
投票

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
}

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


23
投票

编辑:在 PHP 7.1 中,有一个

void
伪类型。它在Void Return Type 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,这使得它们在逻辑上是等效的。


3
投票


2
投票
void

作为可能的回报类型事实上,我们打破了

null
唯一可能类型是
null
的假设。
这样,应该返回

void

来进行

null
的类型检查,通过设计改变架构约束并导致向后兼容性混乱。
// your choice implies this comparison should be true:
gettype(null) === void;

我认为在代码中不经常使用 
null

的人将承担

void
类型实现。
    


0
投票

类似这样的事情。

<?php function foo(): void { print "OK"; return; } foo(); ?>

这将打印“OK”,但它不返回任何内容。

另外,需要注意的是,我们只能使用 void 作为返回类型。我们不能将它用作函数参数类型。

示例:

function myfunction(void $param) { }

它将产生这个致命错误

// Fatal error: void cannot be used as a parameter type

此外,如果您使用OOP,则无法在继承期间更改void返回类型。

示例:

class MyClass { public function myMethod(): void { } } class MyNewClass extends MyClass { public function myMethod(): array { } }

这将产生这个致命错误

Fatal error: Declaration of MyNewClass::myMethod(): array must be compatible with MyClass::myMethod()

	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.