从手册知道,Closure::bindTo — 复制当前闭包对象,绑定指定的$this对象和类作用域。
创建并返回一个 匿名函数, 它与当前对象的函数体相同、绑定了同样变量,但可以绑定不同的对象,也可以绑定新的类作用域。
从我个人理解,和js里面的call函数有点类似。可以改变闭包对象指定的作用域。
示例1:
<?php class A { function __construct($val) { $this->val = $val; } function getClosure() { return function(){return $this->val;}; } } $ob1 = new A(1); $cl = $ob1->getClosure(); echo $cl(),"<br/>"; $ob2 = new A(2); $cl = $cl->bindTo($ob2); //闭包指定作用域在$ob2对象上。 echo $cl()."<br/>"; //2
示例2:
<?php header("Content-type:text/html;charset=utf-8"); class Yifang { public $title = '武汉亿房网'; public $tpl = 'tpl1.php'; } class Bentian { public $title = '东风本田'; public $tpl = 'tpl2.php'; } class views { public function render($obj) { $name = $obj->tpl; $closure = function() use($name){ include './tpl/'.$name; }; $closure = $closure->bindTo($obj); return $closure; } } $View = new views(); call_user_func($View->render(new Bentian())); call_user_func($View->render(new Yifang()));
分别对应的2个模板
1 <?php 2 //tpl1 3 4 echo '======================<br/>'; 5 echo $this->title."<br/>"; 6 echo '武汉江汉区<br/>'; 7 echo '==========================='; 8 9 ?> 10 11 <?php 12 //tpl2 13 14 echo '===========================<br/>'; 15 echo $this->title."<br/>"; 16 echo '屯口经济开发区<br/>'; 17 echo '==========================='; 18 19 ?>
Bind
Closure类摘要如下:
Closure {
__construct ( void )
public static Closure bind (Closure $closure , object $newthis [, mixed $newscope = 'static']
public Closure bindTo (object $newthis [, mixed $newscope = 'static' ])
}
方法说明:
Closure::__construct — 用于禁止实例化的构造函数
Closure::bind — 复制一个闭包,绑定指定的$this对象和类作用域。
Closure::bindTo — 复制当前闭包对象,绑定指定的$this对象和类作用域。
闭包之bind方法
一个实例
<?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实例公有成员属性
总结:
- bind函数:
- 参数1($closure) : 表示闭包函数
- 参数2($newthis): 相当于在函数内/外调用的区别,传类的实例表示在内部调用,NULL相当于在外部调用
- 参数3($newscope): 相当于类和实例调用的区别,函数的作用域, 传类表示静态调用方式,内部可以“类名::属性”的方式使用;实例表示实例调用方式,内部可以“->”