Как получить доступ к родительскому объекту из лямбда-функций? - PullRequest
33 голосов
/ 04 марта 2011

У меня есть рекурсивная лямбда-функция в одном из моих объектов, и она должна получить доступ к подключению объекта mysqli. Эта попытка

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

Произошла необоснованная фатальная ошибка

Неустранимая ошибка: невозможно использовать $ this в качестве лексической переменной в C: \ Users \ Codemonkey1991 \ Desktop \ workspace \ melior \ objects \ databasemanager.php в строке 88

Может ли кто-нибудь дать мне несколько советов?


Edit: просто чтобы прояснить контекст, я пытаюсь создать эту лямбда-функцию внутри другой функции.

Ответы [ 2 ]

50 голосов
/ 04 марта 2011

Поскольку замыкания сами по себе являются объектами, вам необходимо присвоить $this локальной переменной, например:

$host = $this;
$recfunc = function($id, $name) use ($host) { ...
4 голосов
/ 09 мая 2016

Ссылку на $this не нужно явно передавать в лямбда-функцию.

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!'
...