PHP 7.1 - 为什么void返回值没有警告?

Sco*_*nan 10 php php-7.1

PHP手册指出,在新的公司概述无效在PHP 7.1中添加的返回类型:

尝试使用void函数的返回值只需求值为NULL,不会发出警告.这是因为警告会影响通用高阶函数的使用.

" 警告会暗示使用高阶函数 "是什么意思?

Mar*_*tin 7

高阶函数(HOF)是遵循以下条件中的至少一个的函数 -

  • 将一个或多个函数作为参数
  • 返回一个函数作为结果

资源

然后从PHP Void RFC:

既然return; 和return null; 在技​​术上等同于PHP; 如果未指定返回值,PHP将为null您生成.但是,选择一个而不是另一个意味着意图.如果指定值,则表明该值很重要.在void函数中,返回值是无关紧要的:它总是相同的,没有实际用处.使用return null显式指定它; 没有意义,因为函数将返回什么值并不重要.

(我的亮点)

因此,根本不需要提供警告,它只需要使用另一个函数和额外的重要编译时开销来通知故意不返回的代码片段的返回错误.

可以这样想:

  • 我将保持很多海绵待命,只是因为空的牛奶纸盒被撞倒了.

纸箱将永远是空的,所以没有必要去商店买12个超级吸收海绵!


要准确查看将调用哪些函数,请尝试探索PHP 7的(开源)编译时错误处理逻辑; 查看将调用哪些函数来处理导致类似错误的函数(例如返回无法识别或不正确的类型).

这些函数将是通过静默返回而不是PHP 7.1预期返回类型上的错误调用函数.nullvoid


Nik*_*kiC 5

问题是这样的情况:

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();
Run Code Online (Sandbox Code Playgroud)

此代码可以处理void和non-void函数。如果使用void函数的返回值会发出警告,那么我们将无法编写此代码,而必须执行以下操作:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是很多不必要的样板,更不用说必须使用昂贵的反射调用来实现“ returns_void”。