繁体   English   中英

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

[英]Access instance of class in callback anonymous function

我有一类带有一些将匿名函数作为参数的方法的类。 该类如下所示:

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

我将如何实现?

谢谢

使用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。 文档中的相关报价:

闭包也可以从父范围继承变量。 任何此类变量都必须传递给use语言构造。 从父作用域继承变量与使用全局变量不同。 全局变量存在于全局范围内,无论执行什么功能,该变量都是相同的。 闭包的父作用域是在其中声明闭包的函数(不一定是从其调用的函数)。

更新

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

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();

输出:

我可以看到自己的私人零件!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM