PHP,Closure类

时间:2012-07-21 12:40:19

标签: php class closures

我试图了解封闭类,在手册中, 全部在手册Link

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

但我不明白几行:

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

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

手册中的最后一句我不理解这句话:

  

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

如果有人可以试着向我解释一下,我会非常感激,祝你有愉快的一天。

2 个答案:

答案 0 :(得分:8)

指的是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

答案 1 :(得分:3)

我认为bindbindTo之间的区别就在于它们被称为:

$cl->bindTo($obj)

相当于

Closure::bind($cl, $obj)

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