例如,我有一些代码:
class A
{
private $value = 100;
}
$a = new A;
$closure = function(){echo $this->value;};
$binding = $closure->bindTo($a,"A"); /// tag
$binding();
我有一些问题:
tag
第二个参数的行中写为“A”时,是否意味着执行上下文在匿名函数内部与“A”类内部相同?答案 0 :(得分:7)
让我帮助您解释http://php.net/Closure.bindTo
上的手册
newscope
关闭关联关联的类范围,或者静态'保持现有的。如果给出了一个对象,则将使用该对象的类型。 这决定了绑定对象的受保护和私有方法的可见性。
所以,回答你的第一个问题,是的,这意味着代码被解释为它是A
类的方法。
如果上下文是"static"
(第二个问题),那么,在执行时你得到:
致命错误:无法访问第1行的php shell代码中的私有属性A :: $ value
那是因为"static"
将保持当前[范围] (即Closure设置为持续的范围;例如,如果它被绑定到A
,它将继续与A
绑定。在这种情况下,它只是没有结合,现在仍然没有结合;它没有神奇的行为,就像它是A
类(或任何扩展它的类)的一部分一样,因此无法访问受保护或私有属性。
关于第三个问题,"static"
这里只是保留当前设定的范围。它没有其他意义。 "static"
作为标识符的唯一原因是没有类可以命名为static
(因此它不会与任何可能的类名冲突)。
即。 (使用初始示例中的$closure
):
$binding = $closure->bindTo($a, "A"); // scope is now A class
$second_binding = $binding->bindTo($a, "static"); // scope is still A class
$second_binding(); // works fine, no access issues