7

我试图了解闭包类,在手册中有,所有在手册链接

Closure::__construct - 不允许实例化的构造函数。如果我理解正确,则此类的唯一实例是用于匿名函数变量分配。

但我不明白几行:

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

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

最后在手册中我不明白这句话:

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

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

4

2 回答 2

8

它指的是召唤魔法

据我了解,对于任何包含方法的类,__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::__invoke是一种魔法方法

于 2012-07-21T12:50:26.547 回答
3

bind我认为和之间的区别bindTo只是它们被称为的方式:

$cl->bindTo($obj)

相当于

Closure::bind($cl, $obj)

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

于 2012-07-21T12:56:54.807 回答