在函数中使用默认参数


177

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

我完全希望这样的事情能奏效。但这根本不符合我的预期。似乎不管我做什么,每次调用该函数时,无论如何我都必须最终键入默认参数。而且我必须缺少明显的东西。


68
您可能什么都不丢失,PHP开发人员可能错过了这一点。
Matti Virkkunen'2

这是一个有趣的问题。正如您所说,我从未真正需要执行此操作,因为当我不确定什么取决于原始参数时,我仅使用默认args扩展其他程序员继承的功能。我很好奇答案。
凯庆

3
我一段时间以来看到的最好的问题之一!您是否尝试过不传递任何内容?foo("blah", , "test");
马达拉的幽灵2012年

2
规则是默认参数只能跟随参数。那就是你可以让foo(“ blah”)和x,y为默认值,或者foo(“ Blah”,“ xyz”)和y为默认值。
老鼠食物

1
预期的行为。请参阅以下部分中的“默认参数值”部分:php.net/manual/en/functions.arguments.php-接受空值和空字符串作为该函数的实际参数
jmdavalos

Answers:


164

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

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仍将获得其默认值。

使用此方法,传递空值意味着要覆盖一个参数的默认值,而要覆盖其后的参数的默认值。

如其他答案所述,

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

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

这是另一个示例(虽然不能回答您的问题,但希望能为您提供有益的参考:

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

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

为什么不是$ x = isset($ x)?$ x:'默认值'; ?
zloctb 2015年

@zloctb,这是一个清晰可读的空检查。看起来是开发人员的偏爱。$ x = isset($ x)吗?$ x:'默认值'; 或$ x = is_null($ x)?'默认值':$ x; 将与该解决方案一样有效。这是有关可读性和维护性的首选。
DeveloperWeeks

9
只是为了将来的读者澄清一下。很明显,第一种解决方案使得不可能为null参数分配实际值,因为每次都会分配默认值。即使在您确实需要null的情况下有另一个特殊值(例如,当$ x ==“ use_null”使$ x = null)时,也无法将此类特殊值分配为参数(在本例中为“ use_null”字符串)。因此,当您要使用默认值(并且希望null成为有效选项)时,请务必使用唯一的,永远不需要的“键”
DiegoDD
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.