1.理解这两个方法,首先要明白闭包。
闭包的理解:就是匿名函数,也就是没有名字的函数
例如:
1 2 3 4 5 6 7 8 | <?php $a = function ( $args ){ echo "i haven't name" ; echo "=" . $args ; }; $a (11); ?> |
输出:i haven't name=11
2.这两个函数需要解决的问题。(我也不知道,这东西能解决啥问题,待我明白能解决的问题再补上吧)
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <?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
说白了就是将一个匿名函数放在了一个实例中。
解释一下关于第二个和第三个参数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <?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,简单说下。
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?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/>' ; ?> |