php closure 的bind和bindTo

1.理解这两个方法,首先要明白闭包。

闭包的理解:就是匿名函数,也就是没有名字的函数

例如:

<?php
 
$a = function($args){
    echo "i haven't name";
    echo "=".$args;
};
$a(11);
?>

输出:i haven't name=11

2.这两个函数需要解决的问题。(我也不知道,这东西能解决啥问题,待我明白能解决的问题再补上吧)

例如:

<?php
class user{
private $money = 200;
public $level = 0;
public function beatMonster(){
echo "beat monster!";
}
}
//进入游戏之后新建一个角色xf
$xf = new user;
 
 
$uplevel = function(){
$this->level++;
};
 
 
$upmylevel = closure::bind($uplevel,$xf,'user');
 
 
echo $xf->level;
echo '<br/>';
$upmylevel();
echo $xf->level;
echo '<br/>';
?>

 

输出:01

说白了就是将一个匿名函数放在了一个实例中。

解释一下关于第二个和第三个参数:

<?php
/**  
 * 复制一个闭包,绑定指定的$this对象和类作用域。  
 *  
 * @author LeoKim
 */  
class Animal {  
    private static $cat = "cat";  
    private $dog = "dog";  
    public $pig = "pig";  
}  
  
/*  
 * 获取Animal类静态私有成员属性 
 */  
$cat = static function() {  
    return Animal::$cat;  
};  
  
/*  
 * 获取Animal实例私有成员属性 
 */  
$dog = function() {  
    return $this->dog;  
};  
  
/*  
 * 获取Animal实例公有成员属性 
 */  
$pig = function() {  
    return $this->pig;  
};  
  
$bindCat = Closure::bind($cat, null, new Animal());// 给闭包绑定了Animal实例的作用域,但未给闭包绑定$this对象  
$bindDog = Closure::bind($dog, new Animal(), 'Animal');// 给闭包绑定了Animal类的作用域,同时将Animal实例对象作为$this对象绑定给闭包  
$bindPig = Closure::bind($pig, new Animal());// 将Animal实例对象作为$this对象绑定给闭包,保留闭包原有作用域  
echo $bindCat(),'<br>';// 根据绑定规则,允许闭包通过作用域限定操作符获取Animal类静态私有成员属性  
echo $bindDog(),'<br>';// 根据绑定规则,允许闭包通过绑定的$this对象(Animal实例对象)获取Animal实例私有成员属性  
echo $bindPig(),'<br>';// 根据绑定规则,允许闭包通过绑定的$this对象获取Animal实例公有成员属性  
?>

输出:

cat

dog

pig

解释一下:

第二个参数:

官方原话:需要绑定到匿名函数的对象,或者 NULL 创建未绑定的闭包。

这是啥,完全懵逼啊。经过各种尝试。明白了,可以理解为,

你把这个匿名的方法是否放在一个实例中,如果放在实例中,

这个参数就是一个实例,如果不放在实例中,那就放null。

当你不放在实例中,也就是不存在$this。也就不能用$this

不过只有这一个参数,没有第三个,通过$this只能访问public 的参数

第三个参数:

官方原话:想要绑定给闭包的类作用域,或者 'static' 表示不改变。

如果传入一个对象,则使用这个对象的类型名。 

类作用域用来决定在闭包中 $this 对象的 私有、保护方法 的可见性。

这是啥意思,你问我,我也懵逼。不过你就记住,这个参数设置

实例或者是,类名例如:'Composer\Autoload\ClassLoader'

就能访问static ,私有的,保护的了

然后说下 bindTo,简单说下。

例如:

<?php
class user{
private $money = 200;
public $level = 0;
public function beatMonster(){
echo "beat monster!";
}
}
//进入游戏之后新建一个角色xf
$xf = new user;
 
$uplevel = function(){
$this->level++;
};
 
$upmylevel = $uplevel->bindTo($xf,'user');
echo $xf->level;
echo '<br/>';
$upmylevel();
echo $xf->level;
echo '<br/>';
 
?>