從手冊知道,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 ?>
