函数调用缺少参数

时间:2016-01-12 09:05:46

标签: php function

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

6 个答案:

答案 0 :(得分:2)

你有几个选择来处理这种情况。这是我能想到的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);
    }
}

答案 1 :(得分:0)

只要把''代替函数调用的错过参数。

FU(''''' ARG3'' ARG4&#39);

答案 2 :(得分:0)

你可能来自另一种编程语言,比如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']) ;

答案 3 :(得分:0)

另一种可能的解决方案,扩展阵列方法:

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'));

答案 4 :(得分:0)

如果你的论点没有修复,你可以使用func_get_arg()

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

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

答案 5 :(得分:0)

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

ArrayList joined = new ArrayList();
for(Objec[] b : bs){
    A a = hash.get(b.b1);
    joined.add(new Object[]{a, b});
}

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

可能是有意义的