【问题标题】:Access instance of class in callback anonymous function在回调匿名函数中访问类的实例
【发布时间】:2014-09-05 19:33:31
【问题描述】:

我有一个类,其中包含一些将匿名函数作为参数的方法。该类如下所示:

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

我将如何实现这一目标?

谢谢

【问题讨论】:

    标签: php class closures


    【解决方案1】:

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

    输出:

    我可以看到自己的私处!

    【讨论】:

    • 感谢您的回复。如果我想公开课程并尽可能减少需要在课程之外完成的工作怎么办?我可以在课堂上处理“用例”吗?
    • 我不确定我是否真的理解您的评论,您是在问是否将此功能放在一个类中,您还可以在 $self 对象上调用私有/受保护的方法吗?
    猜你喜欢
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多