在函数中使用默认参数

2022-08-30 06:21:01

我对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");   

我完全期待这样的事情会起作用。但它根本没有像我预期的那样工作。似乎无论我做什么,每次调用函数时,我最终都必须输入默认参数。我一定错过了一些明显的东西。


答案 1

我建议按如下方式更改函数声明,以便您可以执行所需的操作:

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

    if (null === $y) {
        $y = "some other value";
    }

    code here!

}

这样,您可以进行类似调用并使其按所需方式工作,其中第二个参数仍获取其默认值。foo('blah', null, 'non-default y value');$x

使用此方法时,传递 null 值意味着当您想要覆盖某个参数后面的参数的默认值时,需要该参数的默认值。

如其他答复所述,

默认参数仅用作函数的最后一个参数。如果要在函数定义中声明默认值,则无法省略一个参数并覆盖其后面的一个参数。

如果我有一个可以接受不同数量的参数和不同类型的参数的方法,我经常声明类似于Ryan P显示的答案的函数。

这是另一个例子(这没有回答你的问题,但希望能提供信息:

public function __construct($params = null)
{
    if ($params instanceof SOMETHING) {
        // single parameter, of object type SOMETHING
    } elseif (is_string($params)) {
        // single argument given as string
    } elseif (is_array($params)) {
        // params could be an array of properties like array('x' => 'x1', 'y' => 'y1')
    } elseif (func_num_args() == 3) {
        $args = func_get_args();

        // 3 parameters passed
    } elseif (func_num_args() == 5) {
        $args = func_get_args();
        // 5 parameters passed
    } else {
        throw new \InvalidArgumentException("Could not figure out parameters!");
    }
}

答案 2

可选参数仅在函数调用结束时起作用。如果不指定$x,就无法在函数中为$y指定值。某些语言通过命名参数(例如VB / C#)支持此功能,但不支持PHP。

如果您使用关联数组作为参数而不是参数,则可以模拟这一点 - 即

function foo(array $args = array()) {
    $x = !isset($args['x']) ? 'default x value' : $args['x'];
    $y = !isset($args['y']) ? 'default y value' : $args['y'];

    ...
}

然后像这样调用该函数:

foo(array('y' => 'my value'));

推荐