如何将对象上下文传递给匿名函数?

Tim*_*Tim 9 php scope anonymous-function

有没有一种方法可以将对象上下文传递给匿名函数而不$this作为参数传递?

class Foo {
    function bar() {
        $this->baz = 2;
        # Fatal error: Using $this when not in object context
        $echo_baz = function() { echo $this->baz; };
        $echo_baz();
    }
}
$f = new Foo();
$f->bar();
Run Code Online (Sandbox Code Playgroud)

bin*_*yLV 11

你可以分配$this一些变量,然后使用use关键字将这个变量传递给函数,当定义函数时,虽然我不确定它是否更容易使用.无论如何,这是一个例子:

class Foo {
    function bar() {
        $this->baz = 2;
        $obj = $this;
        $echo_baz = function() use($obj) { echo $obj->baz; };
        $echo_baz();
    }
}
$f = new Foo();
$f->bar();
Run Code Online (Sandbox Code Playgroud)

值得注意的是,$obj它将被视为标准对象(而不是$this),因此您将无法访问私有和受保护的成员.

  • 注意:PHP v5.4现在允许在匿名函数中使用`$ this`. (6认同)