PHP 是否允许命名参数,以便可以从函数调用中省略可选参数?
在 PHP 中,是否可以在调用函数/方法时指定一个命名的可选参数,跳过您不想指定的参数(如在 python 中)?
像这样:
function foo($a, $b = '', $c = '') {
// whatever
}
foo("hello", $c="bar"); // we want $b as the default, but specify $c
在 PHP 中,是否可以在调用函数/方法时指定一个命名的可选参数,跳过您不想指定的参数(如在 python 中)?
像这样:
function foo($a, $b = '', $c = '') {
// whatever
}
foo("hello", $c="bar"); // we want $b as the default, but specify $c
不,这是不可能的(在 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)
但我真的不喜欢这个解决方案:
因此,我只会在非常特殊的情况下使用此功能 - 例如,对于具有大量可选参数的函数...
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
有关更多信息,以下是一些进一步解释此功能和一些常见相关错误的潜在客户:(我与以下网站没有隶属关系)