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/>'; ?>