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 总是绑定父类thisscope新创建的闭包。静态闭包和非静态闭包的区别在于静态闭包有scope(!= NULL) 但this创建时没有。“顶级”闭包既没有this也没有scope

因此,在创建闭包时必须摆脱范围。幸运bindTo的是,即使对于静态闭包,也允许这样做:

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

看起来这可能是不可能的,来自Closure::bindTo 文档

静态闭包不能有任何绑定对象(参数 newthis 的值应该是 NULL),但是这个函数仍然可以用来改变它们的类范围。

于 2013-05-31T18:16:29.023 回答