PHP8.0新版本发布了两大新特性,今天分别多两种类型展开讨论。
1、联合返回类型声明,允许返回多个可能返回的类型。
<?php
class Stu {
// 参数为联合类型
public function add (int | float $a,int | float $b): int {
return $a+$b;
}
// 参数和返回都为联合类型
public function sub (int | float $a,int | float $b): float|int {
return $a+$b;
}
// 参数为不同的联合类型
public function mul (int | float $a,int | string $b):string {
return $a+$b;
}
}
$stu = new Stu();
$rest=$stu->add(10,20);
var_dump($rest);
// int(30)
$rest=$stu->add(10.3,'20');
var_dump($rest);
// int(30) 从float 30.3到int的隐式转换失去了精度
$rest=$stu->sub(30.25,20);
var_dump($rest);
// float(50.25)
$rest=$stu->mul(30.25,20);
var_dump($rest);
// string(5) "50.25"
2、命名参数调用,支持在调用时通过参数名而非位置传递参数。
<?php
class Stu{
// 参数和返回值都有数据类型
public function add (int $a,int $b): int {
return $a + $b;
}
// 带...的多参数
public function sub (int | float $a,int | float $b, ...$c): float|int {
$rest = $a - $b;
if($c) {
foreach($c as $value) {
if(is_array($value)) {
foreach($value as $val) {
$rest -= $val;
}
}
}
}
return $rest;
}
}
$stu = new Stu();
// 正常调用
$rest = $stu->add(100,100);
var_dump($rest);
// int(200)
// 按参数名调用,如果使用用参数名,后面需要用参数时必须要指定,比如第一个参数用b参数名称,第二册参数必须指定a参数,不然报错
$rest = $stu->add(b:120,a:100);
var_dump($rest);
// int(220)
// 不传c参数 表示为空数组
$rest = $stu->sub(10.3,10);// Array ( )
var_dump($rest);
// float(0.3000000000000007)
// 传1个c参数 表示为一个数组
$rest = $stu->sub(10.3,10,[10,20]); // Array ( [0] => Array ( [0] => 10 [1] => 20 ) )
var_dump($rest);
// float(-29.7)
// 传2个c参数 表示为两个数组 以此类推
$rest = $stu->sub(10.3,10,[10,20],[10,20,30]);// Array ( [0] => Array ( [0] => 10 [1] => 20 ) [1] => Array ( [0] => 10 [1] => 20 [2] => 30 ) )
var_dump($rest);
// float(-89.7)
通过以上新功能的测试后,发现语法与python的语法类似,一方面可以专递多个参数,另一方面可以按指定参数传递参数。php的语法真是混合语法,你有的我有,你没有的我也有。
看完本文有收获?点赞、分享是最大的支持!