**一.参数类型**
1.位置参数
```
str_contains('FooBar', 'Foo');
```
2.命名参数
```
str_contains(haystack: 'FooBar', needle: 'Foo');
```
**二.命名参数定义**
```
#声明$中的参数名称不带符号将是参数名称,或函数形参的名字取$后变为实参的命名参数.
#格式:name:'user1'或name:$name
function show($name,$age){
echo "$name,$age";
}
show(name:'user1',age:'123');
```
**三.支持命名参数兼容程度**
1.新函数
```
function str_contains(string $haystack, string needle): bool {}
$b=str_contains(needle:'php8',haystack:'my name is php8',);
var_dump($b);
```
2.自定义函数
```
function show($name,$age){
echo "$name,$age";
}
```
3.大部分不向后兼容
```
echo substr(string:'my name is php8',start:3,length:4);
```
**四.传参顺序**
```
#命名参数可不按参数顺序传递
show(name:$name,age:$age);
show(age:$age,name:$name);
```
**五.可选参数和默认值**
```
#当函数或方法用默认值声明参数时,并且如果命名参数调用站点没有为该参数设置值,则将使用默认值,就像位置参数调用一样.
function show($name,$age=20){
echo "$name,$age";
}
show('user1');
show(name:'user1');
```
**六.跳过参数**
```
#如果未在调用站点上明确设置,则命名参数将继承默认值。这样就可以跳过函数/方法调用的可选参数,这对于位置参数如果没有默认值就无法实现。
function show($name,$age=20,$sex='nan'){
echo "$name,$age,$nan";
}
show(name:'user1',sex:'nv');
#扩展实例
try{
show(sex:'nv');
}catch(ArgumentCountError){
echo 'sex nv error';
}
```
**七.覆盖参数**
```
#不允许覆盖之前设置的参数:
function show($name,$age){
echo "$name,$age";
}
show(name:'user1',age:25,name:'user2');
```
**八.混合命名和位置参数**
```
#可以在同一调用中使用命名参数和位置参数,位置参数必须在命名参数前面。
function show($name,$age){
echo "$name,$age";
}
show(name:'user1',25);
```
**九.带有继承链的命名参数**
```
#PHP的命名参数功能允许重命名参数名称。
class Person{
public function show($name){
echo $name;
}
}
class User extends Person{
public function show($age){
echo $age;
}
}
$obj=new User();
$obj->show(age:25);
```
**十.func_get_arg函数**
```
#注意参数顺序
function show($name, $age){
echo func_get_arg(0);
}
show(age:25,name:'user1');
```
**十一.可变参数的命名参数**
```
#可变参数可以收集未分配给先前参数(如果有)的参数,并且其名称将被保留。
function show($a, $b, ...$args) {
print_r($args);
}
show(1,2,name:'user1',age:25,sex:'nv');
show(1,2,80,name:'user1',age:25,sex:'nan');
```