dud*_*son 8 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();
irc*_*ell 33
是的,这是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设置为你调用的foo实例baz().
所以:
$bar = $f->bar();
$bar();
结果是:
注意:未定义的变量:这在第5行的/ in/Bpd3d中
空值
和
$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:
警告:无法将实例绑定到第12行的/ in/h63iF中的静态闭包
注意:未定义的变量:这在第9行的/ in/h63iF中
空值
所以在5.4+中,你可以声明一个静态闭包,这会导致它永远不会$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..."
| 归档时间: | 
 | 
| 查看次数: | 3649 次 | 
| 最近记录: |