/**
* 獲取一個函式的依賴
* @param string|callable $func
* @param array $param 呼叫方法時所需引數 形參名就是key值
* @return array 返回方法呼叫所需依賴
*/
function getFucntionParameter($func,$param=[]) {
if(!is_array($param)) {
$param = [$param];
}
$ReflectionFunc = new \ReflectionFunction($func);
$depend = array();
foreach($ReflectionFunc->getParameters() as $value) {
if(isset($param[$value->name])) {
$depend[] = $param[$value->name];
}elseif($value->isDefaultValueAvailable()){
$depend[] = $value->getDefaultValue();
}else{
$tmp = $value->getClass();
if(is_null($tmp)) {
throw new \Exception("Function parameters can not be getClass {$class}");
$depend[] = $this->get($tmp->getName());
return $depend;
function test($a,$b=20) {
echo $a,",",$b;
$depend = getFucntionParameter("test",["a"=>30,"b"=>40]);
call_user_func_array("test",$depend); // 30,40
上面的函式是我開發的框架的容器的方法。
php提供了很完整的反射機制。不但可以反射函式,還可以反射方法,反射類建構函式。
/**
* 獲取一個函式的依賴
* @param string|callable $func
* @param array $param 呼叫方法時所需引數 形參名就是key值
* @return array 返回方法呼叫所需依賴
*/
function getFucntionParameter($func,$param=[]) {
if(!is_array($param)) {
$param = [$param];
}
$ReflectionFunc = new \ReflectionFunction($func);
$depend = array();
foreach($ReflectionFunc->getParameters() as $value) {
if(isset($param[$value->name])) {
$depend[] = $param[$value->name];
}elseif($value->isDefaultValueAvailable()){
$depend[] = $value->getDefaultValue();
}else{
$tmp = $value->getClass();
if(is_null($tmp)) {
throw new \Exception("Function parameters can not be getClass {$class}");
}
$depend[] = $this->get($tmp->getName());
}
}
return $depend;
}
function test($a,$b=20) {
echo $a,",",$b;
}
$depend = getFucntionParameter("test",["a"=>30,"b"=>40]);
call_user_func_array("test",$depend); // 30,40
上面的函式是我開發的框架的容器的方法。
php提供了很完整的反射機制。不但可以反射函式,還可以反射方法,反射類建構函式。