【问题标题】:PHP complex function parameter passingPHP复杂函数参数传递
【发布时间】:2014-08-28 07:16:04
【问题描述】:

请有人帮我解决这个和平的代码,我完全迷路了。我正在使用外国程序,我需要以无限参数量运行函数 MainFunc() 一次。有两种参数类型:“输入”和“输出”,因此“输入”是一个有两个参数的函数。 “输入”和“输出”函数在别处实现,我不感兴趣。

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

我可以硬编码定义的参数,但我想从其他来源(数据库)获取它们,并且可以有很多组(每个组内的输入和输出)。

谁能解释一下这个 PHP 语法结构是如何工作的,我如何转换它以传递无限的参数量?

【问题讨论】:

  • @cmorrissey 考虑到它是关于调用链式方法而不是对函数的单个调用,它确实不是重复的。
  • 这不是一个确切的问题,而是一个我如何编码的问题。这超出了网站的范围。
  • @JonathanKuhn 我在回答“我怎样才能将它转换为传递无限的参数量”,因为这似乎是他问题的根源

标签: php syntax


【解决方案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,最大..),我如何循环你的参数?我确信功能会一一对应:“输入”比“输出”,“输入”比“输出”。
  • 如果它们交替出现,那么您可以执行检查偶数/奇数键并调用任一函数之类的操作。然后使用 call_user_func_array 调用带有任意数量参数的方法。我将更新我的循环示例。
【解决方案2】:

所有函数可能返回$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 数组以从数据库中获取数据。我刚刚给他们提供了样本数据。

【讨论】:

  • 这些方法可能不返回$this,而是返回另一个对象实例的工厂。在这种情况下,您可能希望捕获每个方法的返回并在其上调用下一个函数。
  • @JonathanKuhn 你说得对,我们真的不知道这个函数会返回什么。我已将可能添加到我的答案中
猜你喜欢
  • 1970-01-01
  • 2014-04-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多