动态函数参数

时间:2010-10-30 22:56:09

标签: php

我将所有调用传递给主映射函数 然后它应该根据字符串动态调用其他函数(直到这一部分,事情很简单) 问题是我想将参数传递给第二个函数,这些参数可能会有所不同。 给出以下内容(不应更改):

function test1($x){
     echo $x;
}

function test2($x, $y){
     echo $x * $y;
}

现在出现了映射函数

function mapping ($str){
      switch ($str){
          case 'name1':
              $fn_name = 'test1';
              $var = 5;
              break;
          case 'name2':
              $fn_name = 'test2';
              $var = 5;
              break;
      }
      $this->{$fn_name}($var);
}

然后这将运行映射:

$this->mapping('name1');
$this->mapping('name2');   // This one will crash as it need two variables

当然,上面的内容被简化为关注问题而不是代码的目的。 问题是当函数有多个参数时(很容易发生)。 我期待有开关盒,并根据案例参数的填充方式,行 $this->{$fn_name}($var); 应该有用。

你知道不能改变函数(test1,test2)结构,请你建议或给我一些想法。我不能突然开始使用func_get_args()func_get_arg()

2 个答案:

答案 0 :(得分:5)

您可以使用ReflectionFunction及其invokeArgs()方法传递数组中的变量:

function mapping ($str) {
    switch ($str) {
        case 'name1':
            $fn_name = 'test1';
            $fn_args = array(5);
            break;
        case 'name2':
            $fn_name = 'test2';
            $fn_args = array(5, 10);
            break;
    }

    $function = new ReflectionFunction($fn_name);
    $function->invokeArgs($fn_args);
}

答案 1 :(得分:2)

由于代码中的mapping()似乎是一个类方法,因此请将其替换为:

public function __call($method, $args)
{
    // possibly validate $method first, e.g. with a static map
    return call_user_func_array($method, $args);
}

示例:

function foo($foo) { echo $foo; }
function bar($foo, $bar) { echo "$foo - $bar"; }

$this->foo('foo'); // outputs 'foo'
$this->bar('foo', 'bar'); // outputs 'foo - bar'

这意味着您的班级不应该为foo()调用方法bar()__call()

虽然似乎是一个非常复杂的问题。对于您想要实现的目标,可能有更优雅的解决方案? :)