是的,这是5.4中完全有效的语法.
基本上,它会阻止当前类自动绑定到闭包(实际上,它会阻止所有绑定,但稍后会更多).
class Foo {
public function bar() {
return static function() { var_dump($this); };
}
public function baz() {
return function() { var_dump($this); };
}
}
如果我们在5.4上实例化它,则闭包bar()返回将$this设置为null.就像你对它进行静态调用一样.但是baz()会将$this设置为你调用baz()的foo实例.
所以:
$bar = $f->bar();
$bar();
结果是:
Notice: Undefined variable: this in /in/Bpd3d on line 5
NULL
和
$baz = $f->baz();
$baz();
结果是
object(Foo)#1 (0) {
}
合理?大.
现在,如果我们在函数外部定义闭包会发生什么:
$a = function() { var_dump($this); };
$a();
我们得到null(和通知)
$c = $a->bindTo(new StdClass());
$c();
我们得到StdClass,正如您所期望的那样
$b = static function() { var_dump($this); };
$b();
我们得到null(和通知)
$d = $b->bindTo(new StdClass());
$d();
这是事情变得有趣的地方.现在,我们收到警告,通知和null:
Warning: Cannot bind an instance to a static closure in /in/h63iF on line 12
Notice: Undefined variable: this in /in/h63iF on line 9
NULL
所以在5.4中,你可以声明一个静态闭包,这导致它永远不会将$this绑定到它,也不能将对象绑定到它…