使用extract()函数直接将参数插入到类方法中的问题

时间:2016-07-09 06:53:16

标签: php methods parameter-passing

这是否可能我尝试使用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是动态确定的,因此我无法事先知道每个方法的参数。 感谢

3 个答案:

答案 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);