例如,我有一些代码:
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)
我有一些问题:
tag
第二个参数的行中写为"A"时,是否意味着执行上下文在匿名函数内部与"A"类内部相同?让我帮助您解释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)