8

インスタンスを静的クロージャーにバインドしたり、静的クラス メソッド内に非静的クロージャーを作成したりすることは可能ですか?

これは私が意味するものです...

<?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();
4

2 に答える 2

3

PHP は常に親thisをバインドし、scope新しく作成されたクロージャーにバインドします。静的クロージャーと非静的クロージャーの違いは、静的クロージャーにはscope(!= NULL) がありますが、作成時にはないthisことです。「トップレベル」のクロージャには、thisも もありませんscope

したがって、クロージャーを作成するときにスコープを取り除く必要があります。幸いなbindToことに、静的クロージャーの場合でも、まさにそれが可能です。

$m=(new ReflectionMethod('TestClass','testMethod'))->getClosure()->bindTo(null,null);
$m();
于 2014-02-19T13:16:34.610 に答える