Использование $ this, когда не в контексте объекта с ReflectionFunction- & gt; invoke ()

class someClass {
private $success = "success\n";
function getReflection() {
return new ReflectionFunction(function() {
print $this->success;
});
}
}
$reflection = (new someClass)->getReflection();
$reflection->invoke();

Когда я запускаю это, я получаю

Fatal error: Using $this when not in object context in Command line code on line 5

Что тут происходит? Почему $this не определен там …?

Поскольку я нахожусь в замыкании внутри метода, $this как правило, должны быть определены. И да, я на более новой версии, чем PHP 5.4.

Как я могу это исправить?

4

Решение

ReflectionFunction работает с несвязанными замыканиями. Вот почему после ReflectionFunction::invoke() звоните, нет определенного $this переменная внутри замыкания и, как таковая, появляется ваша фатальная ошибка.

Но есть способ обойти это.

ReflectionFunction предлагает три необходимых метода для вызова его с помощью $this связывание:

  • ReflectionFunctionAbstract::getClosure()
  • ReflectionFunctionAbstract::getClosureThis()
  • ReflectionFunctionAbstract::getClosureScopeClass()

ReflectionFunctionAbstract::getClosure() все еще не связан, но мы можем связать его через Closure::bind(),

Все Closure::bind() needs — это Closure, желаемый объект, который будет связан, и область видимости класса.

Тогда решение:

call_user_func(\Closure::bind(
$reflection->getClosure(),
$reflection->getClosureThis(),
$reflection->getClosureScopeClass()->name));

Сначала я хотел опубликовать это как вопрос, но я сам нашел решение прямо перед публикацией, поэтому просто добавил ответ. Контекст был этой проблемой: https://github.com/rdlowrey/Auryn/pull/72

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]