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

我满心期待这样的东西能起作用。但它完全不像我想象的那样。似乎无论我做什么,每次调用函数时,我都必须输入默认参数。我肯定遗漏了一些明显的东西。


当前回答

我最近遇到了这个问题,找到了这个问题和答案。虽然上面的问题可以工作,但问题是它们不会向支持它的ide显示默认值(如PHPStorm)。

如果你使用null,你将不知道它的值是什么,如果你让它为空。

我更喜欢的解决方案是将默认值也放在函数定义中:

protected function baseItemQuery(BoolQuery $boolQuery, $limit=1000, $sort = [], $offset = 0, $remove_dead=true)
{
    if ($limit===null) $limit =1000;
    if ($sort===null) $sort = [];
    if ($offset===null) $offset = 0;
    ...

唯一的区别是我需要确保它们是相同的-但我认为这是为额外的清晰度付出的一个小代价。

其他回答

function image(array $img)
{
    $defaults = array(
        'src'    => 'cow.png',
        'alt'    => 'milk factory',
        'height' => 100,
        'width'  => 50
    );

    $img = array_merge($defaults, $img);
    /* ... */
}

PHP 8使用命名参数

如果我想使用参数$x的默认值,并为$y设置一个值,该怎么办? Foo ($blah, $x = "some value", $y = "some other value")

Usage-1:

foo(blah: "blah", y: "test");

Usage-2:

// use names to address last arguments
foo("blah", y: "test");

本地函数也将使用此特性

htmlspecialchars($string, double_encode: false);
// Same as
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);

关于特性和文档

命名实参允许根据形参名称而不是形参位置向函数传递实参。这使得参数的含义自记录,使参数与顺序无关,并允许任意跳过默认值。

支持的想法

Netbeans 12.3完全支持PHP 8.0语法,包括这个特性,除了命名参数的代码补全。

<?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

?>

我的2美分与空合并运算符??(从PHP 7开始)

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

你可以在我的replyit上查看更多的例子

你也可以检查你是否有一个空字符串作为参数,这样你可以调用:

Foo ('blah', "", '非默认y值',null);

函数下面:

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

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

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

    code here!

}

不管你填的是null还是"",你仍然会得到相同的结果。