PHP静态匿名函数真的有效吗?

PHP静态匿名函数真的有效吗?,php,anonymous-function,Php,Anonymous Function,我正在尝试学习PHP,现在我被困在“静态匿名函数”中 我在一篇教程()中发现了这一点 “面向对象 Lambda函数是闭包,因为它们会自动绑定到创建它们的类的范围 范围中并不总是需要“$this” 删除“$this”可以节省内存 您可以通过将Lambda函数声明为static来阻止此行为。” 这个代码有什么问题 我得到这个错误: 解析错误:解析错误,第11行的C:\wamp\www\z-final\a.php中应为'T_PAAMAYIM\u NEKUDOTAYIM' 为什么“返回静态函数(){

我正在尝试学习PHP,现在我被困在“静态匿名函数”中

我在一篇教程()中发现了这一点

“面向对象

  • Lambda函数是闭包,因为它们会自动绑定到创建它们的类的范围
  • 范围中并不总是需要“
    $this
  • 删除“
    $this
    ”可以节省内存
  • 您可以通过将Lambda函数声明为static来阻止此行为。”
这个代码有什么问题

我得到这个错误:

解析错误:解析错误,第11行的C:\wamp\www\z-final\a.php中应为'T_PAAMAYIM\u NEKUDOTAYIM'

为什么“返回静态函数(){var_dump($this);};”这一代码行不起作用


应该不需要使用
static
关键字定义它

<?php
class House
{
     public function paint($color)
     {
         return function() use ($color) { return "Painting the house $color..."; };
     }
}

$house = new House();
$callback = $house->paint('red');
var_dump($callback); // object(Closure)#2 (2) {..}
var_dump($callback()); // "Painting the house red..."

是的,这在5.4+中是非常有效的语法

基本上,它阻止了当前类与闭包的自动绑定(实际上,它阻止了所有绑定,但稍后会有更多内容)

如果我们在5.4+上实例化它,那么闭包
bar()
返回的
$this
将设置为null。就像你对它进行了静态调用一样。但是
baz()
会将
$this
设置为您在上调用的
baz()
的foo实例

因此:

结果:

注意:未定义变量:第5行中的/in/Bpd3d

空的

导致

对象(Foo)#1(0){

}

有道理吗?太好了

现在,如果我们使用函数外部定义的闭包,会发生什么情况:

$a = function() { var_dump($this); };
$a();
我们得到
null
(和一个通知)

我们得到了
StdClass
,正如您所期望的那样

$b = static function() { var_dump($this); };
$b();
我们得到
null
(和一个通知)

这就是事情变得有趣的地方。现在,我们得到一个警告、一个通知和一个空值:

警告:无法将实例绑定到第12行/in/h63iF中的静态闭包

注意:未定义的变量:这在第9行的/in/h63iF中

空的


因此,在5.4+中,您可以声明一个静态闭包,这导致它永远无法将
$this
绑定到它,也无法将对象绑定到它…

问题在于
return
function()之间的
static
关键字。
您试图实现什么?不,不是。问题是没有使用PHP5.4+,也许你的意思是
静态
而不是
严格
?他问的是语法错误,而不是是否应该使用静态anon函数。静态anon与anon不同。请注意,从PHP 7.1开始,上述答案中的所有通知和警告都被视为
致命错误
$bar = $f->bar();

$bar();
$baz = $f->baz();

$baz();
$a = function() { var_dump($this); };
$a();
$c = $a->bindTo(new StdClass());
$c();
$b = static function() { var_dump($this); };
$b();
$d = $b->bindTo(new StdClass());
$d();