【问题标题】:PHP, The Closure classPHP,闭包类
【发布时间】:2012-07-20 11:49:35
【问题描述】:

我正在尝试了解关闭类,在手册中有, 全部在手册Link

Closure::__construct - 不允许实例化的构造函数。如果我理解正确的话,这个类的唯一实例是匿名函数变量赋值。

但我没看懂几行:

Closure::bind — 复制具有特定绑定对象和类范围的闭包。

Closure::bindTo — 使用新的绑定对象和类范围复制闭包。

手册上的最后一句我没看懂:

除了这里列出的方法,这个类还有一个 __invoke 方法。这是为了与实现的其他类保持一致 调用魔法,因为此方法不用于调用函数。

如果有人可以向我解释一下这些台词,我将非常感激,祝你有美好的一天。

【问题讨论】:

  • 谢谢大家,我现在正在阅读答案。

标签: php class closures


【解决方案1】:

指的是calling magic

据我了解,对于任何包含方法 __invoke 的类,可以像调用函数一样调用其实例。 Closure::__invoke 就是这样操作的。

即当$foo 属于Closure 类(匿名函数)时,调用$foo($bar) 将调用$foo->__invoke(bar)(虽然__invoke 成员并不打算直接调用,这只是为了说明它是如何工作的)。

当你定义匿名函数时,你这样做:

$greet = function($name)
{
    printf("Hello %s\r\n", $name);
};

现在,$greet 属于 Closure 类。和$greet->__invoke 有点等于function($name){ printf("Hello %s\r\n", $name); }

请记住,Closure::__invokeMagic Method

【讨论】:

  • 感谢 Alvin Wong 对 __invoke 魔术方法的解释,我现在也知道我可以在 OOP 使用的另一种魔术方法,所以谢谢你,祝你有美好的一天。
【解决方案2】:

我认为bindbindTo 之间的区别只是它们的称呼方式:

$cl->bindTo($obj)

等价于

Closure::bind($cl, $obj)

关于__invoke方法,是说该方法存在,但实际上并未使用。当您将闭包用作函数时,会使用一种内部(可能更有效)机制来绕过该方法。但是该方法的存在是为了与其他可调用的类兼容,如果您愿意,可以手动调用它。

【讨论】:

  • 谢谢 Barmar,您能否详细介绍一下 bind 和 bindTo,因为如果您可以比较 bindTo 和 bind to a code,我不知道我是否正确。
  • this 声明 This method is a static version of Closure::bindTo().
  • 查看文档中的示例。我不认为我能做得比这更好。它们只是编写完全相同的东西的两种不同方式 - bindTo 是面向对象的,而 bind 是传统的函数样式。
猜你喜欢
  • 1970-01-01
  • 2020-05-11
  • 2014-03-05
  • 2011-12-18
  • 2021-11-02
  • 2016-07-10
  • 2011-05-06
  • 2017-02-12
  • 2019-06-21
相关资源
最近更新 更多