Closure 用于获取并使用匿名函数、将匿名函数绑定到具体的类,从而实现对匿名函数的更多控制。
举个例子:
#不绑定,直接使用匿名函数
$f = function ($var){
return $var;
};
function getClosure(Closure $f,$var){
return $f($var);
}
echo getClosure($f,'closure');
#将匿名函数绑定到类再使用
class dog{
public $food = 'Bone';
}
$eat = function (){
echo 'eat '.$this->food.PHP_EOL;
};
$eat_food = Closure::bind($eat,new dog());
$eat_food();
CLosure的绑定有两种方式:
/*
*@param Closure $closure 用来绑定的匿名函数.
*@param object $newthis 设置匿名函数应该绑定到的对象, NULL表示不绑定到
*@param mixed $newscope 设置匿名函数的类作用域,默认值是 'static', 表示不改变
*/
public static Closure bind (Closure $closure , object $newthis [, mixed $newscope = 'static' ])
/*
*@param object $newthis 设置匿名函数应该绑定到的对象, NULL表示不绑定到
*@param mixed $newscope 设置匿名函数的类作用域,默认值是 'static', 表示不改变
*/
public Closure bindTo (object $newthis [, mixed $newscope = 'static' ])
举例说明具体用法:
class cat{
public $food='fish';
}
class dog{
private $food = 'Bone';
}
class pig{
private static $food = 'Rice';
}
class monkey{
private static $food = 'Banana';
}
$eat = function (){
echo 'eat '.$this->food.PHP_EOL;
};
$eat_ = static function (){
echo 'eat '.self::$food.PHP_EOL;
};
$eat_food = Closure::bind($eat_,null,new pig());
$eat_food();//eat Rice
$eat_food = Closure::bind($eat,new cat());
$eat_food();//eat fish
$eat_food = Closure::bind($eat,new dog(),'dog');
$eat_food();//eat Bone
$eat_food = $eat_->bindTo(null,'monkey');
$eat_food();//eat Banana