简单记录下通过反射来获取某方法的参数,然后利用php内置函数类执行此方法
一个简单的test类
1 class test 2 { 3 //2个参数默认值 4 public function b($name='lemon',$age,$city='wuhan') 5 { 6 echo '<pre>';
8 print_r(func_get_args()); 9 } 10 }
要传入的参数
1 $params = [ 2 'name'=>'zc', 3 'age'=>25 4 ];
通过反射类来获取方法来合并参数
1 $args = $actionParams = $missing = []; 2 3 $method = new ReflectionMethod('test', 'b'); 4 foreach ($method->getParameters() as $param){ 5 6 $name = $param->getName();//获取参数名 7 //$params 参数存在于 传入的参数之中 8 if (array_key_exists($name,$params)) { //有传参数, 按传入的参数 9 //反射方法 测试该参数是否为数组类型 10 if ($param->isArray()){ 11 $args[] = $actionParams[$name] = (array) $params[$name]; 12 } elseif(!is_array($params[$name])) { //参数不是数组类型 如 name = lemon 13 $args[] = $actionParams[$name] = $params[$name]; 14 } else { 15 throw new Exception('error'); 16 } 17 unset($params[$name]); 18 } elseif ($param->isDefaultValueAvailable()) { //没有传参数, 检测时候参数有默认值 19 //getDefaultValue 获取参数默认值 20 $args[] = $actionParams[$name] = $param->getDefaultValue(); 21 } else { 22 $missing[] = $name; 23 break; 24 } 25 } 26 27 if (!empty($missing)){ 28 throw new Exception('missing parmters'); 29 }
执行方法
1 $handler = [new test(),'b']; 2 if (is_callable($handler)) { 3 call_user_func_array($handler,$args); 4 }
最后打印得到数组如下,和预想一样
Array ( [0] => zc [1] => 25 [2] => wuhan )