PHP - 命名参数
PHP 从 8.0 版本开始引入了 命名参数 特性。这是现有按位置传递参数给函数机制的扩展。
默认情况下,传递的参数值会复制到相同位置的对应形参中。PHP 中的命名参数特性使得可以根据参数名称而非位置来传递值。
位置参数示例
如果我们定义了一个如下函数 −
function myfunction($x, $y) {
statement1;
statement2;
. . .
}
并以如下方式调用 −
myfunction(10, 20);
在这种情况下,值会按照声明顺序传递给变量 "x" 和 "y"。也就是说,第一个值给第一个参数,第二个值给第二个参数,依此类推。变量 "x" 和 "y" 是位置参数。
要使用命名参数传递值,请指定要将值传递给哪个参数的名称。参数名称是形参名称去掉 "$" 符号后的名称。要传递的值放在 ":" 符号前面。
myfunction(x:10, y:20);
命名参数示例
以下代码演示了如何在 PHP 中使用 命名参数 −
<?php
function myfunction($x, $y) {
echo "x = $x y = $y";
}
myfunction(x:10, y:20);
?>
输出
它将产生以下输出 −
x = 10 y = 20
使用 命名参数 可以以任意顺序传递值,而不必按照函数定义中参数声明的顺序。我们可以如下调用 myfunction(),并产生相同结果。
myfunction(y:20, x:10);
借助此特性,参数变得与顺序无关且具有自文档化特性。它还允许任意跳过具有默认值的参数。
结合命名参数与位置参数
命名参数可以与位置参数结合使用,但条件是命名参数必须位于位置参数之后。
<?php
function myfunction($x, $y, $z) {
echo "x = $x y = $y z = $z";
}
myfunction(10, z:20, y:30);
?>
输出
它将生成以下结果 −
x = 10 y = 30 z = 20
但是,如果尝试将 $z 作为位置参数处理,
myfunction(x:10, y:20, 30);
在这种情况下,PHP 将遇到以下 错误 −
PHP Fatal error: Cannot use positional argument after named argument in hello.php on line 7
从数组传递命名参数
PHP 8.1.0 还引入了另一特性,允许在解包参数后使用命名参数。与逐个为每个参数提供值不同,可以使用 "..."(三个点)在数组前解包数组中的值到对应的参数。
<?php
function myfunction($x, $y, $z=30) {
echo "x = $x y = $y z = $z";
}
myfunction(...[10, 20], z:30);
?>
输出
它将产生以下输出 −
x = 10 y = 20 z = 30
注意,多次传递同一参数会导致如下异常 −
myfunction(x:10, z:20, x:20);
错误 −
PHP Fatal error: Uncaught Error: Named parameter $x overwrites previous argument in hello.php:7
位置参数 vs 命名参数
位置参数按照函数参数的相同顺序传递。在这种情况下,位置或顺序很重要。请查看位置参数的示例 −
<?php
def greet(name, age):
print(f"Hello, my name is {name} and I am {age} years old.")
greet("Amit", 25)
?>
输出
它将产生以下输出 −
Hello, my name is Amit and I am 25 years old.
而使用参数名称传递的参数称为命名参数。因为你指定了参数名称,所以位置并不重要。
<?php greet(name="Amit", age=25) ?>
输出
它将产生以下输出 −
Hello, my name is Amit and I am 25 years old.
或者更改顺序 −
<?php greet(age=25, name="Amit") ?>
上述代码的输出将相同。这证明了更改参数顺序不会影响程序的输出。
通过引用传递参数
通常,当你将变量传递给函数时,PHP 会对其进行复制。如果你函数内部更改变量,函数外部的原始值保持不变。但是,当你传递引用(使用 & 符号)时,函数使用原始变量而不是副本。因此,如果函数更改了变量,这种更改将在函数外部反映出来!
<?php
function updateString(&$str)
{
$str .= " updated";
}
$text = "This is just a test string";
updateString($text);
echo $text;
?>
输出
它将生成以下输出 −
This is just a test string updated
当你想在函数内更新变量并在函数外保持更改时,这非常有用。但你必须小心,因为错误更改变量可能会导致程序中出现意外结果。