在函数中使用默认参数

221

我对 PHP 函数的默认值感到困惑。比如我有一个函数像这样:

function foo($blah, $x = "some value", $y = "some other value") {
    // code here!
}

如果我想使用$x的默认参数,并为$y设置不同的参数怎么办?

我一直在尝试不同的方法,但越来越困惑。例如,我尝试了以下两种方法:

foo("blah", null, "test");
foo("blah", "", "test");

但是这两种方式都不能得到一个合适的$x$默认参数。我还尝试通过变量名来设置它。

foo("blah", $x, $y = "test");   

我完全期望像这样的东西能够起作用。但它根本不像我预期的那样工作。似乎无论我做什么,每次调用函数我都必须手动输入默认参数。而且我一定漏掉了某些显而易见的东西。


95
你可能没有错过什么,PHP开发者可能错过了这个问题。 - Matti Virkkunen
3
最近看到的最好的问题之一!你尝试过什么都不传递吗? foo("blah", , "test"); - Madara's Ghost
3
规则是默认参数只能跟在其他参数后面。也就是说,你可以有类似于 foo("blah"),而 x 和 y 是默认值的情况,或者有类似于 foo("Blah","xyz"),其中 y 是默认值。 - Mouse Food
@ThinkingMonkey,当我将null或""设置为第二个默认值时,它会用null替换默认值...至于foo("blah", $x, $y = "test"),我得到了一个未定义的变量$x。如果我做类似foo("blah", $y = "test")的事情,它会用test替换$x的值,而不是$y。 - renosis
3
期望的行为。请参见“默认参数值”部分:https://www.php.net/manual/en/functions.arguments.php -- null 值和空字符串都可以作为函数的实际参数。 - jmdavalos
显示剩余5条评论
16个回答

1

我对null合并运算符??(自PHP 7起)有一些看法。

function foo($blah, $x = null, $y = null) {
    $varX = $x ?? 'Default value X';
    $varY = $y ?? 'Default value Y';
    // ...
}

您可以在我的repl.it上查看更多示例。


0

另一种写法:

function sum($args){
    $a = $args['a'] ?? 1;
    $b = $args['b'] ?? 1;
    return $a + $b;
}

echo sum(['a' => 2, 'b' => 3]); // 5 
echo sum(['a' => 2]); // 3 (2+1)
echo sum(['b' => 3]); // 4 (1+3)
echo sum([]); // 2 (1+1)

0

PHP 8 的做法:

function foo($blah, ?$x, ?$y) {
    $x = $x ?? "some value";
    $y = $y ?? "some other value";
}

“现代化”?这个回答不会经久耐用。请指明这适用于哪些PHP版本。 - thelr

0

这是一个情况,当对象更好时 - 因为你可以设置你的对象来保存x和y,设置默认值等。

使用数组的方法接近创建对象(实际上,对象是一组参数和函数,将在对象上工作,而以数组为参数的函数将在一些参数组上工作)

当然,你总是可以做一些技巧来设置null或类似的东西作为默认值


0

将数组传递给函数,而不是单独的参数,并使用null合并运算符(PHP 7+)。

下面,我传递了一个包含2个项目的数组。在函数内部,我检查item1的值是否设置,如果没有,则分配默认值。

$args = ['item2' => 'item2',
        'item3' => 'value3'];

    function function_name ($args) {
        isset($args['item1']) ? $args['item1'] : 'default value';
    }

在 PHP 7+ 中,您可以使用 $args['item1'] = $args['item1']??'default value';。如果 $args['item1'] 为 null,则会将字符串 default value 分配给 $args['item1']。 - Sadee

-1
<?php
function info($name="George",$age=18) {
echo "$name is $age years old.<br>";
}
info();     // prints default values(number of values = 2)
info("Nick");   // changes first default argument from George to Nick
info("Mark",17);    // changes both default arguments' values

?>

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