PHP 是否允许命名参数,以便可以从函数调用中省略可选参数?

在 PHP 中,是否可以在调用函数/方法时指定一个命名的可选参数,跳过您不想指定的参数(如在 python 中)?

像这样:

function foo($a, $b = '', $c = '') {
    // whatever
}


foo("hello", $c="bar"); // we want $b as the default, but specify $c

答案 1

不,这是不可能的(在 PHP 8.0 之前):如果要传递第三个参数,则必须传递第二个参数。命名参数也是不可能的。


“解决方案”是只使用一个参数,一个数组,并始终传递它...但不要总是定义其中的所有内容。

例如:

function foo($params) {
    var_dump($params);
}

并这样称呼它:(键/值数组)

foo([
    'a' => 'hello',
]);

foo([
    'a' => 'hello',
    'c' => 'glop',
]);

foo([
    'a' => 'hello',
    'test' => 'another one',
]);

将为您提供此输出:

array
  'a' => string 'hello' (length=5)

array
  'a' => string 'hello' (length=5)
  'c' => string 'glop' (length=4)

array
  'a' => string 'hello' (length=5)
  'test' => string 'another one' (length=11)

但我真的不喜欢这个解决方案:

  • 您将失去 phpdoc
  • 您的 IDE 将无法再提供任何提示...这很糟糕

因此,我只会在非常特殊的情况下使用此功能 - 例如,对于具有大量可选参数的函数...


答案 2

PHP 8 于 2020 年 11 月 26 日发布,其中包含一个名为 named arguments 的新功能。

在这个主要版本版本中,“命名参数”(又名“命名参数”)在调用本机和自定义函数时为开发人员提供了一些非常酷的新技术。

现在可以使用第一个参数(因为它没有默认值)调用此问题中的自定义函数,然后仅使用命名参数传递的第三个参数,如下所示:(Demo)

function foo($a, $b = '', $c = '') {
    echo $a . '&' . $b . '&' . $c;
}

foo("hello", c: "bar"); 
// output: hello&&bar

请注意,第二个参数不需要在函数调用中声明,因为它定义了默认值 - 默认值在函数体中自动使用。

此新功能的部分优点在于,您无需注意命名参数的顺序 - 其声明的顺序无关紧要。foo(c: “bar”, a: “hello”);工作原理是一样的。能够“跳过”声明和编写声明性参数将提高脚本的可读性。这个新功能的唯一缺点是函数调用中会有更多的膨胀,但我(和许多其他人)认为好处超过了这个“成本”。

下面是一个本机函数省略参数、将参数写出其正常顺序并声明引用变量的示例。(演示limit)

echo preg_replace(
         subject: 'Hello 7',
         pattern: '/[a-z ]/',
         count: $counted,
         replacement: ''
     )
     . " & " . $counted;
// output: H7 & 5

关于这个新功能,还有更多要讲的。您甚至可以使用关联数组将命名参数传递给函数,其中可以使用 spread/splat 运算符解压缩数据!

(*请注意声明引用变量的细微差别。(演示)

$params = [
    'subject' => 'Hello 7',  // normally third parameter
    'pattern' => '/[a-z ]/', // normally first parameter
    // 'limit'               // normally fourth parameter, omitted for this demonstration; the default -1 will be used
    'count' => &$counted,    // normally fifth parameter
    //         ^-- don't forget to make it modifiable!
    'replacement' => '',     // normally second parameter
];
echo preg_replace(...$params) . " & " . $counted;
// same output as the previous snippet

有关更多信息,以下是一些进一步解释此功能和一些常见相关错误的潜在客户:(我与以下网站没有隶属关系)


推荐