Привязка экземпляров объектов к статическим замыканиям
Можно ли привязать экземпляр к статическому замыканию или создать нестатическое замыкание внутри метода статического класса?
Вот что я имею в виду...
<?php
class TestClass {
public static function testMethod() {
$testInstance = new TestClass();
$testClosure = function() use ($testInstance) {
return $this === $testInstance;
};
$bindedTestClosure = $testClosure->bindTo($testInstance);
call_user_func($bindedTestClosure);
// should be true
}
}
TestClass::testMethod();
2 answers
PHP всегда привязывает родительские this
и scope
к вновь созданным замыканиям. Разница между статическим замыканием и нестатическим замыканием заключается в том, что статическое замыкание имеет scope
(!=NULL), но не this
в время создания .
Закрытие "верхнего уровня" не имеет ни this
, ни scope
.
Поэтому при создании замыкания необходимо избавиться от области видимости. К счастью, bindTo
допускает именно это, даже для статических замыканий:
$m=(new ReflectionMethod('TestClass','testMethod'))->getClosure()->bindTo(null,null);
$m();
Похоже, что это может быть невозможно, начиная с Закрытие::Документация bindTo
Статические замыкания не могут иметь никакого связанного объекта (значение параметра newthis должно быть равно НУЛЮ), но, тем не менее, эту функцию можно использовать для изменения области их класса.