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

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


当前回答

<?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 8中,我们可以使用命名参数来解决这个问题。

所以我们可以解决这个问题的原始海报所描述的问题:

如果我想使用$x的默认参数,并为$y设置一个不同的参数呢?

:

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

参考:https://wiki.php.net/rfc/named_params(特别是“跳过默认值”部分)

您不能直接这样做,但是稍微修改一下代码就可以进行模拟。

function foo($blah, $x = false, $y = false) {
  if (!$x) $x = "some value";
  if (!$y) $y = "some other value";

  // code
}

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

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

使用数组的方法接近于创建对象(事实上,对象是一组参数和函数,它们将在对象上工作,函数接受数组将在一些ov参数上工作)

当然,你总是可以用一些技巧来设置null或类似的默认值

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语法,包括这个特性,除了命名参数的代码补全。