在 PHP 7.1 中新增的 void 返回类型在其 手册概述 中有所记录:
"警告会牵涉到一般高阶函数的使用" 是什么意思?尝试使用 void 函数的返回值会将其简单地计算为 NULL,而不发出任何警告。原因是警告会牵涉到一般高阶函数的使用。
return
; 和 return null
; 在技术上是等价的;当没有指定返回值时,PHP 会为您生成 null
。但是,选择其中一个而不是另一个意味着意图。如果您指定了一个值,则表示该值具有重要性。在 void 函数中,返回值是无关紧要的:它始终相同且没有实际用途。明确地使用 return null; 指定它是毫无意义的,因为函数将返回什么值并不重要。class Forwarder {
public $obj; // Some object
public function __call($method, $args) {
return $this->obj->$method(...$args);
}
}
class Obj {
public function returnsVal(): int { return 42; }
public function returnsVoid(): void { return; }
}
$fwd = new Forwarder;
$fwd->obj = new Obj;
// We want both of these calls to work
$val = $fwd->returnsVal();
$fwd->returnsVoid();
这段代码可以处理无返回值和有返回值的函数。如果使用无返回值函数的返回值会产生警告,那么我们就不能编写这段代码,而必须像下面这样做:
class Forwarder {
public $obj; // Some object
public function __call($method, $args) {
if (returns_void($this->obj, $method)) {
$this->obj->$method(...$args);
} else {
return $this->obj->$method(...$args);
}
}
}
这是很多不必要的样板代码,更不用说“returns_void”将不得不使用昂贵的反射调用来实现。
在其他一些语言(如C语言)中,void函数不能用作表达式,只能用作语句。由于这个RFC添加了一种指定void函数到PHP语法的方式,人们可能会期望在PHP中现在也适用着同样的限制。然而,这并不符合先例。自从PHP创建以来,它就拥有了一种“void函数”,以内置函数的形式存在,并在手册中被记录为“void”。与C语言不同,这种函数可以在表达式中使用。
我们可以改变PHP关于void函数的规则,并禁止在表达式中使用它们,但这会造成向后兼容性问题:现有的PHP代码很可能依赖于在表达式中调用内置的void函数,并且许多代码假设您可以获取任意PHP函数的返回值(例如回调)。
此外,IDE和其他工具可以在使用void函数的返回值时警告用户。语言本身并不严格需要覆盖这一点。
https://wiki.php.net/rfc/void_return_type#use_of_void_functions_in_expressions
PHP已经拥有可用于表达式中的void
内置函数,现在更改将会是一个巨大的向后兼容性问题。