我正在使用 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
类型吗?
针对 void 返回类型的新单独 RFC 已发布,已通过投票,并在 PHP 7.1 中实现。
PHP 中现在有一个
void
返回类型。 :)
取自wiki.php.net:
未来的工作
超出本 RFC 范围的未来工作想法包括:
- 允许函数声明它们根本不返回任何内容(Java 和 C 中为 void)
所以目前没有办法声明您不退回任何东西。
我不知道在你的情况下什么是最好的,但我可能会暂时不声明返回类型。
回答你的问题 PHP 7 中是否会有
void
返回类型:void
或同义词很可能会以某种方式实现。
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 了解更多信息!
编辑:在 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,这使得它们在逻辑上是等效的。
void
作为可能的回报类型事实上,我们打破了
null
唯一可能类型是 null
的假设。这样,应该返回
void
来进行
null
的类型检查,通过设计改变架构约束并导致向后兼容性混乱。// your choice implies this comparison should be true:
gettype(null) === void;
我认为在代码中不经常使用
null
的人将承担
void
类型实现。类似这样的事情。
<?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()