我用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
类型吗?
答案 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
类型的实现。