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

Max*_*Pro 6 php oop closures

例如,我有一些代码:

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

我有一些问题:

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

bwo*_*ebi 9

让我帮助您解释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
Run Code Online (Sandbox Code Playgroud)