2014-09-05 126 views
0

我有一個類,有幾個方法將一個匿名函數作爲參數。這個類看起來是這樣的:在回調匿名函數中訪問類的實例

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 

我該如何實現這一目標?

感謝

回答

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語言結構。從父範圍繼承 變量與使用全局變量 不同。全局變量存在於全局範圍內,無論執行什麼功能,全局變量都是相同的。封閉函數的父範圍是聲明閉包函數的函數(不是必須是函數調用的函數)。

更新

這也可能是讓你知道,你保留你當匿名函數在執行當前所在班級的知名度,在這個簡單的腳本證明:

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

輸出:

我可以看到我自己的私處!

+0

感謝您的回覆。如果我想讓班級公開可用,並儘可能減少班級以外需要完成的任務,該怎麼辦?我可以在課堂上處理'使用'情況嗎? – mast 2014-09-05 20:26:13

+0

我不知道我真的理解你的評論,你問你是否把這個功能放在一個類中,你也可以在'$ self'對象上調用private/protected方法嗎? – 2014-09-05 20:41:55