在回调匿名函数中访问类的实例

时间:2014-09-05 19:33:32

标签: php class closures

我有一个带有一些方法的类,它们将匿名函数作为参数。该课程如下:

class MyClass {
    public function myMethod($param, $func) {
           echo $param;
           user_call_func($func);
    }


    public function sayHello() {
        echo "Hello from MyClass";
    }
}

我希望能够做到这样的事情:

$obj = new MyClass;
$obj->myMethod("Hi", function($obj) {
    echo "I'm in this anonymous function";
    // let's use a method from myClass
    $obj->sayHello();
});

所以,在我的匿名函数中,因为我将$ obj作为参数传递给匿名函数,所以我应该能够从匿名函数中访问它的方法。在这种情况下,我们会看到

I'm in this anonymous function
Hello from MyClass

我将如何实现这一目标?

由于

1 个答案:

答案 0 :(得分:4)

使用use构造:

$self = $this;
$obj->myMethod("Hi", function($obj) use($self) {
    echo "I'm in this anonymous function";
    // let's use a method from myClass
    $obj->sayHello();
});

您必须在另一个变量中捕获$this,因为use不允许$this传入,除非您使用的是PHP> = 5.4 。来自documentation

的相关引用
  

闭包还可以从父作用域继承变量。任何这样的   必须将变量传递给use语言构造。继承   父作用域中的变量与使用全局不同   变量。全局变量存在于全局范围内,即   无论执行什么功能都一样。 a的父范围   闭包是声明闭包的功能(不是   必然是从中调用它的功能。

<强>更新

如匿名函数执行时,知道您保留当前所在类的可见性也可能会有所帮助,如此简单脚本所示:

class Test
{
    public function testMe()
    {
        $self = $this;
        $tester = function() use($self) {
            $self->iAmPrivate();
        };

        $tester();
    }

    private function iAmPrivate()
    {
        echo 'I can see my own private parts!';
    }
}

$test = new Test;
$test->testMe();

输出:

  

我可以看到自己的私人部分!