您的位置:首页 > 编程语言 > PHP开发

php closure 的bind和bindTo

2017-09-06 16:45 148 查看
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 疯狂老司机
*/
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/>';

?>

理解的也就这些了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  php