PHP 命名参数怎么用?

文章导读
Previous Quiz Next PHP 从 8.0 版本开始引入了 命名参数 特性。这是现有按位置传递参数给函数机制的扩展。
📋 目录
  1. 位置参数示例
  2. 命名参数示例
  3. 结合命名参数与位置参数
  4. 从数组传递命名参数
  5. 位置参数 vs 命名参数
  6. 通过引用传递参数
A A

PHP - 命名参数



Previous
Quiz
Next

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

当你想在函数内更新变量并在函数外保持更改时,这非常有用。但你必须小心,因为错误更改变量可能会导致程序中出现意外结果。