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.
Как я могу это исправить?
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
Других решений пока нет …