PHP bindTo和bind

 从手册知道,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): 相当于类和实例调用的区别,函数的作用域, 传类表示静态调用方式,内部可以“类名::属性”的方式使用;实例表示实例调用方式,内部可以“->”

猜你喜欢

转载自blog.csdn.net/linyunping/article/details/80483454
今日推荐