PHP复杂的函数参数传递

时间:2014-07-07 17:59:07

标签: php syntax

请有人帮我解决这段代码的安宁,我完全迷失了。我正在使用外国程序,我需要使用无限参数量运行函数MainFunc()一次。有两种参数类型:"输入"和"输出",因此"输入"是一个有两个参数的函数。功能"输入"和"输出"在其他地方实施,我不感兴趣。

$var->MainFunc()
        ->input(1,2)
        ->output(3)
        ->input(4,5)
        ->output(6)
        ->input(7,8)
        ->output(9)

我可以对已定义的参数进行硬编码,但我想从其他源(DataBase)中获取它们,并且可以有许多组(每组中的输入和输出)。

有人可以解释一下这个PHP语法构造是如何工作的,如何将其转换为传递无限制的参数量?

2 个答案:

答案 0 :(得分:1)

MainFuncinputoutput只返回一个对象的实例。您可以非常轻松地只调用其中一次,将返回值存储在变量中并在下一行进行下一次调用。

例如,这是完全相同的事情:

$tmp = $var->MainFunc();
$tmp = $tmp->input(1,2);
$tmp = $tmp->output(3);
$tmp = $tmp->input(4,5);
$tmp = $tmp->output(6);
$tmp = $tmp->input(7,8);
$tmp = $tmp->output(9);

这意味着您可以轻松地将其置于循环中并在每次迭代时调用输入/输出。

这样的事情也会产生相同的结果:

//array of calls. Could be pulled/generated from db
$args = array(
    array(1,2),
    array(3),
    array(4,5),
    array(6),
    array(7,8),
    array(9)
);

//counter for even/odd (input/output)
$cnt = 0;

//the first call
$tmp = $var->MainFunc();

//loop over the arguments array
foreach($args as $argList){
    $call = array($tmp);
    //change method based on number of arguments
    if($cnt % 2 == 0){
        //even, call input
        $call[] = 'input';
    } else {
        //odd, call output
        $call[] = 'output';
    }

    //call the method
    $tmp = call_user_func_array($call, $argList);

    //increment counter
    $cnt++;
}

编辑:忘了增加计数器。

答案 1 :(得分:0)

所有函数都返回可能 $this,因此您可以使用方法链来运行此代码。

此代码的作用与:

相同
    $var->MainFunc();
    $var->input(1,2);
    $var->output(3);
    $var->input(4,5);
    $var->output(6);
    $var->input(7,8);
    $var->output(9);

如您所见,这与使用无限制参数金额无关。每次输入法有2个参数和输出方法1。

当我理解你的问题时,你可以做那样的事情;

$input = array(array(1,2), array(2,3), array(5,6));
$output = array(1,6,7);

$var->MainFunc();

for ($i=0, $c = count($input); $i<$c; ++$i) {
  $var->input($input[$i][0], $input[$i][1]);
  $var->output($output[$i]);
}

当然,您可以创建从数据库中获取数据的$input$output数组。我只是将样本数据提供给他们。