如其名,Closure——闭包,一个在JavaScript中随处可见的概念,产生并用于(并不准确的说辞)匿名函数( Anonymous functions ),但在PHP语言中有着概念上的些许区别:
- PHP中的闭包有其实现的类,一个表示匿名函数的类(Class used to represent anonymous functions.):
Closure {
/* Methods */
private __construct( void )
public static Closure bind( Closure $closure, object $newthis [, mixed $newscope = "static" ] )
public Closure bindTo ( object $newthis [, mixed $newscope = "static" ] )
public mixed call ( object $newthis [, mixed $...] )
}
- JavaScript中,匿名函数内部可以调用包含它的作用域中的变量,形成闭包。但在PHP中,闭包是类似上述代码的类,需要我们手动的将其与某些特定参数进行绑定,PHP中的匿名函数要调用包含它的作用域中的变量必须在function后使用use关键字。
在类Closure中,有上述的四个方法,下面对这四个方法进行详述:
-
private __construct(void)
不同于PHP中的其他类中的构造函数,这个函数的存在是为了阻止实例化此类的实例,当调用此方法时会产生E_RECOVERABLE_ERROR错误。当匿名函数产生的时候,PHP会同时为其实例化一个Closure的实例。 -
public static Closure bind( Closure $closure, object $newthis [, mixed $newscope = "static" ] )
此方法与下述方法类似,参照下述函数的说明。 -
public Closure bindTo ( object $newthis [, mixed $newscope = "static" ] )
函数用于复制当前的闭包,并将其与特定的需绑定对象和作用域进行绑定。其中$newthis
参数重新指定了匿名函数内部的$this
变量所指定的对象,$newscope
指定了某个类,其中的protect
与private
参数是对此匿名函数可见的,就如同匿名函数是此指定的类中的函数。 -
public mixed call ( object $newthis [, mixed $...] )
调用此闭包,即此匿名函数,并在调用时将此匿名函数与特定的参数进行绑定,参数说明如上所述。
下述简单的Closure使用例子:
<?
phpclass A {
function __construct($val)
{ $this->val = $val; }
function getClosure() {
//returns closure bound to this object and scope
return function() { return $this->val;};
}
}
$ob1 = new A(1);
$ob2 = new A(2);
$cl = $ob1->getClosure();
echo $cl(), "\n";
$cl = $cl->bindTo($ob2);
echo $cl(), "\n";?>
输出结果如下:
1
2
网友评论