PHP静态匿名函数真的有效吗?
我正在尝试学习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' 为什么“返回静态函数(){
- Lambda函数是闭包,因为它们会自动绑定到创建它们的类的范围
- 范围中并不总是需要“
”$this
- 删除“
”可以节省内存$this
- 您可以通过将Lambda函数声明为static来阻止此行为。”
应该不需要使用
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();