从手册知道,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 ?>

 

  

posted on 2016-07-13 14:18  睡着的糖葫芦  阅读(2950)  评论(0编辑  收藏  举报