在以往PHP版本中,如果函数或方法中含有多个可选参数,在调用时,我们需要将要传入的可选参数前面的所有可选参数进行赋值,这样其实对于参数传递非常不方便。因此,PHP8.0引入了命名参数(named_params)的概念。
命名参数定义
先看看官方对命名参数的定义(中文google翻译,不理解的看英文原文理解吧)PHP: rfc:named_params
Named arguments allow passing arguments to a function based on the parameter name, rather than the parameter position. This makes the meaning of the argument self-documenting, makes the arguments order-independent, and allows skipping default values arbitrarily.
命名参数允许基于参数名称(而不是参数位置)将参数传递给函数。 这使得自变量的含义可以自动记录,使自变量与顺序无关,并允许任意跳过默认值。
使用命名参数
说在前面
- 可选参数和必需参数:本篇在定义的方法和函数中使用这两种名称
- 位置参数和命名参数:本篇在方法和函数调用时使用这两种名称
- 命名参数使用过程中最好将可选参数放在必需参数后面,否则容易产生错误,具体参考本篇最后一节【关于参数顺序问题】
函数中使用命名参数
function named_params($a, $b, $c = 0, $d = 0) { echo $a."-".$b."-".$c."-".$d; } echo "function: "; named_params(1, 2, c:3); // result:function: 1-2-3-0
对象方法中使用命名参数
class NamedParams { public function index($a, $b = 0, $c = 0) { echo $a."-".$b."-".$c; } } echo "class: "; (new NamedParams)->index(1, c:3); // result:class: 1-0-3
以上两种在使用上差别不大,分开讲方便理解。
关于参数顺序问题
定义一个可选参数和必需参数位置交叉的函数
function named_params($a, $b = 0, $c, $d = 0) { echo $a."-".$b."-".$c."-".$d; }
#1 位置参数和命名参数交叉使用
# 1 echo "function: "; named_params(1, b:2, 3);
运行后:PHP首先会报不推荐将必需参数放在可选参数后面;然后程序报错:不能将位置参数放在命名参数后面。
#2 改变必选参数位置传递
# 2 echo "function: "; named_params(1, 2, b:3);
运行后:PHP首先会报不推荐将必需参数放在可选参数后面;然后程序报错:命名参数覆盖了之前的参数,也就是在这里2和3都会被认为是$b的参数。
#3 直接使用位置参数传递
# 3 echo "function: "; named_params(1, 2, 3, 4);
运行后:PHP首先会报不推荐将必需参数放在可选参数后面;然后正常返回结果