2011-03-04 11 views
33

Tengo una función lambda recursiva en uno de mis objetos, y necesita acceder a la conexión mysqli del objeto. Este intento¿Cómo acceder al objeto primario desde las funciones lambda?

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

produjo un error grave razonable

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

Podría alguien darme algunos consejos?


Editar: Sólo para aclarar el contexto, estoy tratando de crear esta función lambda dentro de otra función.

Respuesta

50

Debido a que los cierres son en sí mismos objetos, es necesario asignar $this a una variable local, como:

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

Oye, solo una pregunta adicional: ¿cómo haré para que la función se llame a sí misma? – Hubro

+4

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

+3

Al revisar un informe bugs.php.net sobre este error, esta característica se ha agregado a PHP 5.4. –

4

La referencia a $this no tiene que ser aprobado de forma explícita a la función 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!' 
Cuestiones relacionadas