手冊中 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時的問題,以及解決方案這篇一起看加深理解.