PHP和闭包

时间:2011-10-31 10:56:02

标签: php closures

使用JS工作很多我已经开始喜欢闭包,所以我很高兴知道PHP中也有闭包。但是我不能让这些东西工作,这段代码出了什么问题?

class Foo {
    public $Bar;
    public function Foo() {
        $this->Bar = function() { echo "Hello World"; };
    }
};

$F = new Foo();
$F->Bar();

我不断收到PHP Fatal error: Call to undefined method Foo::Bar()次错误。

4 个答案:

答案 0 :(得分:5)

已经在SO上对此进行了很多讨论(参见例如this answer)。这应该可以解决问题:

$b = $f->Bar;
$b();

是的,这是愚蠢的。您可以使用call_user_func()放入一行(请参阅jlb's answer to this question),但丑陋仍然存在。

答案 1 :(得分:2)

如果您想要一个单行解决方案来替换

$F->Bar()

试试这个:

call_user_func($F->Bar);

答案 2 :(得分:1)

PHP在方法和字段之间有分离。实际上,您可以同时拥有一个同名的方法和字段:

class Foo {
    public $Bar;
    function Bar() { echo "hello\n"; }
};

$F = new Foo();
$F->Bar = 42;
$F->Bar(); // echoes "hello"

所以你可以看到,为了避免歧义,在调用具有该名称的方法和访问具有该名称的字段然后将其作为函数调用之间必须有单独的语法。

如果PHP具有更好的语法,它们将支持($F->Bar)(),即任何表达式上的函数调用运算符,但目前只能“调用”变量。

答案 3 :(得分:0)

PHP并不喜欢$F->Bar表示法来访问闭包。

如果稍微改为

$t = $F->Bar();
$t();

然后它有效。