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

使用命名参数可以按任何 Sequences 传递值,而不必按照在函数定义中声明参数的相同 Sequences。我们可以调用如下所示的 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 还引入了另一个功能,允许在解包参数后使用 named 参数。数组中的值不是单独为每个参数提供值,而是使用 “...” 将数组中的值解包到相应的参数中。(三个点)。


<?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