繁体   English   中英

PHP 默认函数参数值,如何为“非最后”参数“传递默认值”?

[英]PHP Default Function Parameter values, how to 'pass default value' for 'not last' parameters?

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

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

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

谢谢。

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()来合并两个数组,用第二个数组中的任何重复元素覆盖第一个数组。

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

$param1 = (is_null ($param1) ? 'value1' : $param1);

然后你可以这样称呼它:

funcName (null, 'non default');

Result:

value1
non default

PHP 8.0 更新

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

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

以前,您必须将一些值作为$param1传递,无论是空值还是默认值,但现在您只能传递第二个参数。

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

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

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

您可以使用'_'来引用未定义的常量并在此之后继续传递变量。

例如(从您的示例扩展):

function funcName($param1='value1',$param2='value2'){
    echo $param1."\n";
    echo $param2."\n";
}

像这样调用函数:

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

会输出这个:

value1
Some Pass value

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM