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

时间:2012-09-25 09:08:36

标签: php anonymous-function

我正在尝试学习PHP,现在我陷入了“静态匿名函数”。

我在教程(http://www.slideshare.net/melechi/php-53-part-2-lambda-functions-closures-presentation

中找到了这个
  

“面向对象

     
      
  • Lambda函数是闭包,因为它们会自动绑定到创建它们的类的范围。
  •   范围内并不总是需要
  • '$this'。
  •   
  • 删除“$this”可以节省内存。
  •   
  • 您可以通过将Lambda函数声明为静态来阻止此行为。“
  •   

此代码有什么问题?

我收到此错误:

  

解析错误:解析错误,期望在第11行的C:\ wamp \ www \ z-final \ a.php中显示“T_PAAMAYIM_NEKUDOTAYIM”

为什么这段代码行不起作用“return static function(){var_dump($ this);};” ?

class foo
{
    public function getLambda()
    {
        return function(){var_dump($this);};
    }

    public function getStaticLambda()
    {
        return static function(){var_dump($this);};
    }
}

$foo = new foo();
$lambda = $foo->getLambda();
$staticLambda = $foo->getStaticLambda();
$lambda();
$staticLambda();

2 个答案:

答案 0 :(得分:25)

是的,这是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();

结果:

  

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

中      

NULL

$baz = $f->baz();

$baz();

结果

  

对象(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:

  

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

     

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

     

NULL

所以在5.4+中,你可以声明一个静态闭包,这会导致它永远不会被$this绑定,也不能将对象绑定到它...

答案 1 :(得分:1)

不需要使用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..."