2011-03-04 20 views
33

Mam rekursywną funkcję lambda w jednym z moich obiektów i musi uzyskać dostęp do połączenia mysqli obiektu. Ta próbaJak uzyskać dostęp do obiektu nadrzędnego z funkcji lambda?

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

Produkowane nieracjonalnego błąd krytyczny

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

Czy ktoś może mi dać kilka wskazówek?


Edycja: Aby wyjaśnić kontekst, próbuję utworzyć tę funkcję lambda w innej funkcji.

Odpowiedz

50

powodu zamknięcia są same obiekty, trzeba przypisać $this do zmiennej lokalnej, jak:

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

Hej, tylko dodatkowe pytanie: w jaki sposób chciałbym uzyskać funkcję nazywania się? – Hubro

+4

'$ recfunc = funkcja ($ id, $ nazwa) użyj ($ host i $ recfunc) {jeśli (FOO) zwróci $ recfunc ($ id, $ name); } ' –

+3

Od sprawdzenia raportu bugs.php.net na temat tego błędu, ta funkcja została dodana do PHP 5.4. –

4

Odniesienie do $this nie musi być jawnie przekazany do funkcji 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!' 
Powiązane problemy