Closure :: bindTo它是如何工作的?

时间:2016-10-05 21:53:38

标签: php oop closures

例如,我有一些代码:

class A
{
    private $value = 100;
}
$a = new A;
$closure = function(){echo $this->value;};
$binding = $closure->bindTo($a,"A"); /// tag
$binding();

我有一些问题:

  1. 当我们在标记为tag第二个参数的行中写为“A”时,是否意味着执行上下文在匿名函数内部与“A”类内部相同?
  2. 如果不是“A”,而是在将要执行的匿名函数的上下文中写入“static”?
  3. 如果我们在第二个参数“static”中写入,那么它是否与LSB相关联?

1 个答案:

答案 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