我对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 foo($blah, $y = "some other value", $x = "some value")

然后你可以像这样调用foo:

foo("blah", "test");

这将导致:

$blah = "blah";
$y = "test";
$x = "some value";

可选参数只在函数调用结束时起作用。如果不指定$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'));

PHP 8的方法:

function foo($blah, ?$x, ?$y) {
    $x = $x ?? "some value";
    $y = $y ?? "some other value";
}
<?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

?>

向函数传递一个数组,而不是单个参数,并使用空合并运算符(PHP 7+)。

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

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

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