【问题标题】:Closure::bindTo how it's work?Closure::bindTo 它是如何工作的?
【发布时间】:2017-02-14 12:12:59
【问题描述】:

例如,我有一些代码:

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”写入“静态”?
  3. 如果我们在第二个参数中写入“静态”,那么它是否与 LSB 相关联?

【问题讨论】:

  • 文档不是已经回答了这些问题吗?
  • 我在文档中没有看到这个

标签: php oop closures


【解决方案1】:

让我在http://php.net/Closure.bindTo帮助您解释手册

newscope

要关联闭包的类范围,或“静态”以保持当前闭包。如果给出了一个对象,则将使用该对象的类型。 这决定了绑定对象的受保护方法和私有方法的可见性。

所以,回答你的第一个问题,是的,这意味着代码被解释为A 类的方法。

如果上下文是"static"(第二个问题),那么在执行时会得到:

致命错误:无法在第 1 行的 php shell 代码中访问私有属性 A::$value

这是因为"static"保持当前的[范围](即闭包被设置为持续的范围;例如,如果它绑定到A,它将保持绑定到@ 987654327@)。在这种情况下,它只是无范围的,现在仍然是无范围的;它不会像 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

【讨论】:

  • 嗯,你不对,你的代码不对:$binding = $closure->bindTo($a, "A"); // scope is now A class $binding = $closure->bindTo($a, "static"); // scope is not still A class $binding(); // error with access issues
  • 你能说说第三个问题吗:“关键字static与LSB有关系”?
  • 关于第二个问题:“哪个是当前范围?”。当前作用域是在匿名函数中找到的吗?
  • @MaximPro 是啊,复制粘贴失败,我是想在已经绑定的 Closure 上绑定,抱歉
  • @MaximPro static 没有其他含义。它只是保留绑定。与 LSB 无关。 — 还澄清了“当前范围”。
猜你喜欢
  • 2013-11-24
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 2011-03-18
  • 2015-06-16
  • 2012-08-31
  • 2012-07-13
  • 2012-05-27
相关资源
最近更新 更多