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
答案 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();
可能是有意义的