Как использовать $this в анонимных функциях?

Читаю мануал PHP:

Версия Описание
5.4.0 Стало возможным использовать $this в анонимных функциях.


Пробую (в JavaScript, кстати, такое работает на ура):

class A
{
    public $me;
    
    public function getMe()
    {
        $x = $this->me;
        return $x();
    }
}

$a = new A;

$a->me = function() { return $this; };

var_dump($a->getMe());


Получаю Notice: Undefined variable: this.
Что за дела? PHP 5.6.7
  • Вопрос задан
  • 595 просмотров
Решения вопроса 1
delphinpro
@delphinpro Куратор тега PHP
frontend developer
Речь идет об использовании анонимной функции внутри метода класса.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Можно передать объект класса через use анонимной функции.
Вот так:

class A {
    public $me;

    public function getMe() {
        $x = $this->me;
        return $x();
    }
}

$a = new A;
$a->me = function() use ($a) {
    return $a;
};

var_dump($a->getMe());
Ответ написан
Adamos
@Adamos
Анонимная функция - это просто функция, а не метод класса. Какой $this, откуда?
class A
{
    public $me;
    
    public function getMe()
    {
        $x = $this->me;
        return $x($this);
    }
}

$a = new A;

$a->me = function($object) { return $object; };

var_dump($a->getMe());
Ответ написан
Audiophile
@Audiophile Автор вопроса
Выходит, что в 5.6 $this можно прописывать только если анонимная функция создаётся внутри метода.

А вот в PHP 7 у анонимных функций (объектов Closure) появился специальный метод call($obj, ...$args).
Мой пример из вопроса, реализованный на PHP 7:

class A
{
    public $me;
    
    public function getMe()
    {
        $x = $this->me;
        return $x();
    }
}

$a = new A;

$a->me = function() { return $this; };

var_dump($a->me->call($a)); // object(A)#1 (1) { ["me"]=> object(Closure)#2 (0) { } }


То есть можно даже не кидать функцию в объект:

class A
{

}

$a = new A;

$closure = function() { return $this; };

var_dump($closure->call($a)); // object(A)#1 (0) { }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы