簡體   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