2011-03-04 34 views
33

我在我的一個對象中有一個遞歸lambda函數,它需要訪問該對象的mysqli連接。這種嘗試如何從lambda函數訪問父對象?

$recfunc = function($id, $name) use($this) { 

產生的不合理的致命錯誤

Fatal error: Cannot use $this as lexical variable in C:\Users\Codemonkey1991\Desktop\workspace\melior\objects\databasemanager.php on line 88

任何人都可以給我一些指點?


編輯:只是爲了澄清上下文,我試圖在另一個函數內部創建這個lambda函數。

回答

50

因爲閉包是自己的對象,你需要分配$this到一個局部變量,如:

$host = $this; 
$recfunc = function($id, $name) use ($host) { ... 
+1

嘿,只是一個額外的問題:我將如何去獲取函數調用自己? – Hubro

+4

'$ recfunc = function($ id,$ name)use($ host,&$ recfunc){if(FOO)return $ recfunc($ id,$ name); }' –

+3

從這個錯誤檢查一個bugs.php.net報告,這個特性已被添加到PHP 5.4中。 –

4

$this參考並不需要明確傳遞給lambda函數。

class Foo { 
    public $var = ''; 

    public function bar() { 
     $func = function() { 
      echo $this->var; 
     }; 
     $func(); 
    } 
} 

$foo = new Foo(); 
$foo->var = 'It works!'; 
$foo->bar(); // will echo 'It works!'