[英]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.