这是否可能我尝试使用extract()函数执行此操作,因为我无法提前获取方法参数
class Test{
public function getData($id){
//use $id here
}
}
$class = 'Test'; //this is determined dymanically
$method = 'getData'; //this is also determined dynamically
$arguments = ['id'=>'1234'];
$test = new $class();
$test->{$method}(extract($arguments));
//这会为Test :: getData()生成一个警告缺少参数1, 称为
如何实施?
EDIT 看起来我已经将它简化得太多了,代码的目的是成为迷你框架中的主要部署机制。所以方法 - getData是动态确定的,因此我无法事先知道每个方法的参数。 感谢
答案 0 :(得分:0)
extract
用于分配变量。对于关联数组的每个元素,它将使用该名称分配给当前范围中的变量。它返回它分配的变量数,而不是任何变量的值。
没有理由在你的情况下使用extract
,只需获取你想要的数组元素:
$test->getData($arguments['id']);
我不确定为什么你会收到关于缺少参数的错误。它应该将1
作为$id
参数传递,因为数组中有一个元素。
如果您不知道函数需要哪些元素,更好的设计是将整个$arguments
数组传递给函数,并让它使用它想要的部分。
public function getData($args) {
$id = $args['id'];
// Use $id
}
...
$test->getData($arguments);
答案 1 :(得分:0)
只需extract
您的数组并传递$id
<?php
class Test{
public function getData($id){
echo $id;
}
}
$arguments = array('id'=>'1234');
extract($arguments);
$test = new Test();
$test->getData($id);
或
$arguments = array('id'=>'1234');
extract($arguments);
$test = new Test();
foreach($arguments as $key=>$value){
$test->getData($$key);
}
答案 2 :(得分:0)
我找到了使用ReflectionMethod的解决方案
$reflection = new \ReflectionMethod('Test', 'getData');
$pass = [];
foreach($reflection->getParameters() as $param){
//parse the method to get its arguments and filter through the sent arguments array
if(isset($args[$param->getName()])){
//check if the arguments exists and select them
$pass[] = $args[$param->getName()];
}
else{
$pass[] = $param->getDefaultValue();
}
}
//execute the resolved parameters
return $reflection->invokeArgs(new Test, $pass);