Привязка экземпляров объектов к статическим замыканиям


Можно ли привязать экземпляр к статическому замыканию или создать нестатическое замыкание внутри метода статического класса?

Вот что я имею в виду...

<?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();
Author: Nathaniel, 2013-05-31

2 answers

PHP всегда привязывает родительские this и scope к вновь созданным замыканиям. Разница между статическим замыканием и нестатическим замыканием заключается в том, что статическое замыкание имеет scope (!=NULL), но не this в время создания . Закрытие "верхнего уровня" не имеет ни this, ни scope.

Поэтому при создании замыкания необходимо избавиться от области видимости. К счастью, bindTo допускает именно это, даже для статических замыканий:

$m=(new ReflectionMethod('TestClass','testMethod'))->getClosure()->bindTo(null,null);
$m();
 3
Author: smilingthax, 2014-02-19 13:16:34

Похоже, что это может быть невозможно, начиная с Закрытие::Документация bindTo

Статические замыкания не могут иметь никакого связанного объекта (значение параметра newthis должно быть равно НУЛЮ), но, тем не менее, эту функцию можно использовать для изменения области их класса.

 1
Author: Orangepill, 2013-05-31 18:16:29