手册中 Closure::bind — 复制一个闭包,绑定指定的$this对象和类作用域。
具体参数可以看手册,这里记录下这个方法的实际用处.
1 <?php 2 3 trait MetaTrait 4 { 5 private $methods = []; 6 7 public function addMethod($methodName,$methodCallable) 8 { 9 if (!is_callable($methodCallable)) 10 throw new InvalidArgumentException('Second param must be callable'); 11 12 //改变作用域到 get_called_class 的对象 13 $this->methods[$methodName] = Closure::bind($methodCallable, $this, get_called_class()); 14 15 } 16 17 public function __call($methodName, array $args) 18 { 19 if (isset($this->methods[$methodName])){ 20 return call_user_func_array($this->methods[$methodName],$args); 21 } 22 23 throw new RuntimeException('There is no method with the given name to call'); 24 25 } 26 27 } 28 29 class HackThursday 30 { 31 use MetaTrait; 32 33 private $dayOfWeek = 'Thursday'; 34 } 35 36 37 $test = new HackThursday(); 38 $test->addMethod('when',function(){ 39 return $this->dayOfWeek; 40 }); 41 42 echo $test->when(); //Thursday
其实这个方法就是以前说过的 Closure::bindTo() 的静态版本, 和PHP 使用reflection时的问题,以及解决方案这篇一起看加深理解.