2012-07-21 133 views
5

我想了解关于closure类,在手动存在, 所有在手动LinkPHP,封闭类

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

,但我不明白的几行:

闭幕::绑定 - 直接复制与特定的绑定对象和类作用域的关闭。

Closure :: bindTo - 用新的绑定对象和类作用域复制闭包。

,并在手册我不明白这句话的最后一个:

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

如果有人可以尝试解释thoes行给我我会非常感激,祝你有美好的一天。

+0

谢谢大家,我正在阅读答案。 – 2012-07-21 12:58:12

回答

7

它指的是calling magic

据我所知,对于任何包含方法__invoke的类,它的实例可以被调用,就像它是一个函数一样。 Closure::__invoke的行为就像那样。

即当$fooClosure类(匿名函数),称$foo($bar)将调用$foo->__invoke(bar)(虽然__invoke成员并不意味着直接调用,这只是为了显示它是如何工作)。

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

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

$greetClosure类的。 $greet->__invoke等于function($name){ printf("Hello %s\r\n", $name); }

并且记住,Closure::__invoke是​​。

+0

谢谢Alvin Wong为你解释有关__invoke魔法的解释我现在也知道另一种魔法,我可以在OOP中使用魔法,所以谢谢你,祝你有美好的一天。 – 2012-07-21 13:08:53

3

我觉得bindbindTo之间的区别仅仅是在他们的调用方式:

$cl->bindTo($obj) 

相当于

Closure::bind($cl, $obj) 

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

+0

谢谢巴尔马可以请你多展开一下关于bind和bindTo因为我不知道如果我能够比较bindTo并且绑定到一个代码,我是否有这个权利。 – 2012-07-21 13:06:51

+0

as [this](http://www.php.net/manual/en/closure.bind.php)指出'此方法是Closure :: bindTo()的静态版本'' – 2012-07-21 13:40:51

+0

查看示例文档。我不认为我能做得比这更好。它们只是编写完全相同的两种不同的方式 - bindTo是面向对象的,而bind是传统的函数风格。 – Barmar 2012-07-23 06:55:57