PHP 默认函数参数值,如何为“不是最后一个”参数“传递默认值”?

50

我们大多数人都知道以下语法:

function funcName($param='value'){
    echo $param;
}
funcName();

Result: "value"
我们想知道如何传递“不是最后一个”参数的默认值?我知道这个术语用法有点不对,但简单示例可能是:
function funcName($param1='value1',$param2='value2'){
    echo $param1."\n";
    echo $param2."\n";
}

我们如何完成以下任务:

funcName(---default value of param1---,'non default');

结果:

value1
not default

希望这很有道理,我们基本上想假设那些不是最后的参数为默认值。

谢谢。


我真的不理解你的问题... 你的第二个例子运行良好 - Manse
问题不在于函数。 - Nanne
1
我很抱歉表达不清楚。但坦白地说,我不知道如何称呼“假设参数列表中不是最后一个参数的参数采用默认值”的情况。 - anonymous-one
1
我的建议指定一个null默认值不是一个解决办法吗?我只是想知道为什么有人对此提出异议,却没有解释原因就将其评为低分。 - Brad
我不明白你为什么要这样做。如果你可以控制函数参数,为什么不按正确的方式排序呢?对我来说,具有默认值的参数比没有默认值的参数不那么重要。 - Christoph Winkler
5个回答

59

PHP不支持你正在尝试做的事情。这个问题的常见解决方法是传递一个参数数组:

function funcName($params = array())
{
    $defaults = array( // the defaults will be overidden if set in $params
        'value1' => '1',
        'value2' => '2',
    );

    $params = array_merge($defaults, $params);

    echo $params['value1'] . ', ' . $params['value2'];
}

使用示例:

funcName(array('value1' => 'one'));                    // outputs: one, 2
funcName(array('value2' => 'two'));                    // outputs: 1, two
funcName(array('value1' => '1st', 'value2' => '2nd')); // outputs: 1st, 2nd
funcName();                                            // outputs: 1, 2

通过这种方式,所有的参数都是可选的。通过传递参数数组,任何在数组中的内容将会覆盖默认值。这可以通过使用array_merge()实现,它会合并两个数组,并用第二个数组中的任何重复元素来覆盖第一个数组。


2
这似乎是最干净的做事方式。虽然有点臃肿(不是你的错...因为PHP没有提供这个功能)... - anonymous-one
1
自 PHP 8.0 起,命名参数已经可用:https://dev59.com/DWkv5IYBdhLWcg3wbgbQ#64072408 - Jsowa

13

很遗憾,这是不可能的。 为了解决这个问题,我建议在您的函数中添加以下行:

$param1 = (is_null ($param1) ? 'value1' : $param1);
您可以像这样调用它:
funcName (null, 'non default');

Result:

value1
non default

3
外层圆括号有什么好处吗?看起来如果这样写$param1 = is_null($param1) ? 'value1' : $param1;也能达到同样的效果。 - Anthony
我使用括号来为编码人员提供清晰度。调试是一个昂贵的事情,问问你的客户吧 ;) - Herbert Van-Vliet

5

PHP 8.0 升级

自 PHP 8.0 起,您想要的解决方案已经可用:命名参数

function funcName($param1 = 'value1', $param2 = 'value2', $param3 = 'value3') {
    ...
}

以前,您必须传递一些值作为$param1,可以是 null 或默认值,但现在只能传递第二个参数。

funcName(param2: 'value');

而且您不必关心参数顺序。

funcName(param2: 'value', param3: 'value');

//is the same as

funcName(param3: 'value', param2: 'value');

此外,我们可以使用命名参数来执行一些花式操作,例如将数组作为参数传递。当我们不知道存储在数组中的确切键时,这非常有帮助,我们不再需要担心变量的顺序了。
$args = [
    'param3' => 'value',
    'param2' => 'value',
];

funcName(...$args);

//works the same as

funcName(param2: 'value', param3: 'value');

我们甚至不需要将数组中的值命名为参数(当然前提是匹配参数顺序)。

$args = [
    'value1',
    'param3' => 'value3',
    'param2' => 'value2',
];

funcName(...$args);

//works the same as

funcName(param1: 'value1', param3: 'value3', param2: 'value2');

//and

funcName('value1', 'value2', 'value3');

1
您的问题的简单解决方案是,不要使用以下内容:
funcName(---default value of param1---,'non default');

Use the following Syntax:

funcName('non default',---default value of param1---);

例子:

function setHeight2($maxheight,$minheight = 50) {
    echo "The MAX height is : $maxheight <br>";
    echo "The MIN height is : $minheight <br>";
}

setHeight2(350,250);
setHeight2(350); // will use the default value of 50

0
您可以使用'_'来引用未定义的常量,然后继续传递变量。
例如(从您的示例扩展):
function funcName($param1='value1',$param2='value2'){
    echo $param1."\n";
    echo $param2."\n";
}

这样调用函数:

funcName('_','Some Pass value');

会输出这个:

value1
Some Pass value

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接