PHP默认函数参数值,如何';传递默认值';对于';不是最后一个';参数?

PHP默认函数参数值,如何';传递默认值';对于';不是最后一个';参数?,php,function,parameters,default,Php,Function,Parameters,Default,我们大多数人都知道以下语法: function funcName($param='value'){ echo $param; } funcName(); Result: "value" 我们想知道如何传递“not last”参数的默认值?我知道这个术语有点离题,但一个简单的例子是: function funcName($param1='value1',$param2='value2'){ echo $param1."\n"; e

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

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

Result: "value"
我们想知道如何传递“not last”参数的默认值?我知道这个术语有点离题,但一个简单的例子是:

function funcName($param1='value1',$param2='value2'){
    echo $param1."\n";
    echo $param2."\n";
}
我们如何满足以下要求:

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

value1
not default
希望这是有意义的,我们希望基本上假定参数的默认值不是最后一个


谢谢。

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

$param1 = (is_null ($param1) ? 'value1' : $param1);
你可以这样称呼它:

funcName (null, 'non default');

Result:

value1
non default

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

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

问题的简单解决方案是,而不是使用:

funcName(---default value of param1---,'non default');
使用以下语法:

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
函数设置高度2($maxheight,$minheight=50){
echo“最大高度为:$maxheight
”; echo“最小高度为:$minheight
”; } 设置高度2(350250); 设置高度2(350);//将使用默认值50
PHP8.0更新

从PHP 8.0开始,您需要的解决方案就可用:

以前必须以
$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');

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


我真的不明白你的问题。。问题不在于功能,我很抱歉不清楚。但坦率地说,我不知道如何使用术语“假定参数的默认值不是参数列表中的最后一个”。我建议指定
null
默认值是否不能提供解决方案?我只是想知道,为什么有人反对得足够多,以至于在没有评论为什么我不明白你为什么要这么做的情况下就把它记下来了。如果您可以控制函数参数,为什么不以正确的方式对其进行排序呢。对我来说,有默认值的参数不如没有默认值的参数重要。这是最干净的方法。虽然有点臃肿(不是你的错…phps,因为没有这个可用的)…命名参数从PHP8.0开始就可用了:外圆括号是否增加了一些好处?它看起来可以与
$param1=is_null($param1)?一起工作value1':$param1我使用括号清楚地说明了编码器。调试是一件昂贵的事情,只需询问您的客户即可;)
$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');