我试图了解封闭类,在手册中, 全部在手册Link,
Closure :: __ construct - 不允许实例化的构造函数。如果我理解正确,这个类的唯一实例是匿名函数变量赋值。
但我不明白几行:
Closure :: bind - 复制具有特定绑定对象和类范围的闭包。
Closure :: bindTo - 使用新的绑定对象和类范围复制闭包。
手册中的最后一句我不理解这句话:
除了此处列出的方法外,此类还具有__invoke 方法。这是为了与其他实现的类保持一致 调用magic,因为此方法不用于调用函数。
如果有人可以试着向我解释一下,我会非常感激,祝你有愉快的一天。
答案 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::__invoke
是Magic Method。
答案 1 :(得分:3)
我认为bind
和bindTo
之间的区别就在于它们被称为:
$cl->bindTo($obj)
相当于
Closure::bind($cl, $obj)
关于__invoke
meethod,它说该方法存在,但它实际上并未使用。当您将闭包用作函数时,使用绕过该方法的内部(可能更有效)机制。但是该方法与其他可调用的类兼容,如果您愿意,可以手动调用它。