【问题标题】:Function call missing argument [duplicate]函数调用缺少参数[重复]
【发布时间】:2016-04-16 19:32:49
【问题描述】:
function fu($arg1 = null, $arg2 = null, $arg3 = null, $arg4 = null){
   echo 'helo world';
}
//can be other defaults instead null;

fu('arg1');
fu(,,'arg3');
fu(,'arg2',,'arg4');

如果可能遗漏任何参数,我该如何调用 fu? 我不能使用 fu(null,'arg2',null,'arg4'); 因为 arg1 的默认值,arg3 可以包含 inf

【问题讨论】:

  • 答案就在这里,但我认为您需要更具体地回答您的问题,因为我们不知道您真正想要什么......

标签: php function


【解决方案1】:

您有几种选择来处理这种情况。这是我能想到的 2 个。

使用数组

使用数组,您不必担心函数接收多少参数,并且每个参数都被命名(使用数组中的键)

function fu($param = array()) {
   // you can test here is $param['arg1'] exists, $param['arg2'] and so on
   echo 'helo world';
}

使用 func_get_args

这样你可以给函数添加多少个你喜欢的参数,但它们没有被命名

function fu()
{
    foreach (func_get_args() as $index => $value) {
        echo "Argument {$index} is: \n", var_export($value);
    }
}

【讨论】:

  • 我相信func_get_args 不是一个好的解决方案,如果使用相同的 default 参数调用该函数超过 2 次。
  • 问这个问题的人也不清楚他的意图是什么。如果您正在寻找可以接受多个参数/参数的函数,这个答案很好
【解决方案2】:

只需将 '' 替换为函数调用的遗漏参数即可。

fu('','','arg3','arg4');

【讨论】:

  • 并且...它将是空字符串 args。
【解决方案3】:

您可能来自另一种编程语言,如 Python,但在 PHP 中,您不能跳过这样的中间参数。可选参数应该放在最后。但是,您可以传递一个命名数组来实现您想要的。像这样的:

function fu ($arr =[]) {
    foreach ( [1, 2, 3, 4] as $key )
        $arr ["arg$key"] =isset($arr["arg$key"]) ? $arr["arg$key"] : null;

    print_r ($arr) ;
    echo "<br />";
}

fu (['arg1' => 'arg1']) ;
fu (['arg3' => 'arg3']) ;
fu (['arg2' => 'arg2', 'arg4' => 'arg4']) ;

【讨论】:

    【解决方案4】:

    另一种可能的解决方案,扩展数组方法:

    function fu($inputArgs = array()) {
       $defaultArgs = array('arg1' => 'x', 'arg2' => 'y');
       $args = array_merge ($defaultArgs, $inputArgs);
    
       //either use $args['arg1'] or extract the values:
       extract($args);
       // now you can use $arg1, $arg2... directly
       ...
    }
    

    您可以使用 $inputArgs 数组中的相同键输入非默认值,例如:

    fu(array('arg2' => 'z'));
    

    【讨论】:

      【解决方案5】:

      如果您的参数不固定,您可以使用func_get_arg()。

      function fu(){
        $args = func_get_args();
        print_r($args);
      }
      

      现在您可以传递 fu() 或 fu('1','null',null) 或 fu(null,'arg2',null,'arg4'); 等任何内容。

      【讨论】:

        【解决方案6】:

        Java 等语言提供了相同方法的多种变体来克服这一点,但在 PHP 中只有一种变体是可能的。 对于不会使用的参数,您必须使用默认参数值作为参数。

        fu('arg1');
        fu(null, null, 'arg3');
        fu(null, 'arg2', null, 'arg4');
        

        我对带有太多可选参数的方法的建议是,要么你的代码太复杂,并且可能从重构中受益,例如创建一个类并将参数传递给 setter,或者如果你想实现一个没有预设数量参数的函数,使用func_get_args(); 可能会有意义

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-01
          • 2012-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-08
          • 1970-01-01
          相关资源
          最近更新 更多