php8新特性,关于函数的形参定义方面,有何新特性?
发布于 作者:苏南大叔 来源:程序如此灵动~
php本来是属于弱类型的,否则也不会被facebook家的hacklang钻了空子。虽然平时没有谁会给php的函数的参数定义个参数类型,但是实际上php的函数的参数,是可以被定义参数类型的。在php@8系列中,这个参数的可定义的规则,又有了新的变化。那么,本文中,将要带来的就是php@8系列中,有关函数定义方面的新特性。

苏南大叔的“程序如此灵动”博客,记录苏南大叔的编程经验总结。本文测试环境:win10,nginx@1.15.11,php@8.2.10-nts。
形参可以定义类型
当然,可以定义形参类型这个事情,并不是从php@8系列开始的。只不过这个是本文讨论内容的根本,所以第一个讲述。范例的需求是计算运费,基础运费10块钱,以后每增加1公斤重量,增加10.5元的运费。
测试代码(传统写法):
function total($count,$price) {
return 10 + $count * $price;
}测试代码(定义了类型的新写法):
function total2(int $count, int $price) {
return 10 + $count * $price;
}
echo total2(1,10)."\n";
echo total2(1,10.50)."\n"; // 被取整了,不符合预期输出是:
20
20
形参多类型方案一【8之前】
在php@8之前,如果形参可以有两种类型,比如:int和float【很常见吧?】。那么,
- 可以不写形参的类型,回归原始。
- 定义两个
php函数,设置不同的形参类型。
上面的例子中,第二个输出显然是错误的,于是有了另外一个函数写法。
function total2(int $count, int $price) {
return 10 + $count * $price;
}
function total3(int $count, float $price) {
return 10 + $count * $price;
}
echo total2(1,10.50)."\n"; // 不符合预期
echo total3(1,10.50)."\n"; // 符合预期输出:
20
20.5区别就在于$price参数的类型不同。

形参多类型方案二【8系列】
在php@8系列里面,并不需要定义多个函数。因为形参的类型,可以使用或|定义了。
function total4(int $count, int | float $price) {
return 10 + $count * $price;
}
echo total4(1,10.5);输出:
20.5
函数调用实参顺序
对于php来说,函数调用的时候,实参就是根据定义的顺序来添加使用的。但是,在php8系列中,可以通过形参名:的形式传递参数了。这样的话,函数的参数被传递的位置就没有那么重要了。
参考代码:
function total4(int $count, int | float $price) {
return 10 + $count * $price;
}
echo total4(1,10.5);
echo total4(price:10.5,count:1);
vscode还不能识别php8的新特性。
新的参数调用方式
不光是自定义函数,可以这么调用。系列函数也可以这么调用。说实话,如果能记得形参的名称的话,这么调用还是很方便的。
$str = "email,phone";
var_dump(explode(",",$str)); // ["email","phone"]
var_dump(explode($str,",")); // [","]
var_dump(explode( string:$str , separator:"," )); // ["email","phone"]输出:
array(2) { [0]=> string(5) "email" [1]=> string(5) "phone" }
array(1) { [0]=> string(1) "," }
array(2) { [0]=> string(5) "email" [1]=> string(5) "phone" }
在explode()这个函数中,如果两个参数位置倒置了。就会得到错误的结果,然而,在php8系列里面,通过“形参名:”的形式,就可以扭转这个局面。参考文章:
可能存在的问题
其实,这里有个问题,就是如何知道参数的实际名称呢?文档或者工具提示里面可能是错误的哦。比如explode()里面的这个分隔符,官方文档里面一直都是写的叫delimiter,而实际定义的是separator。当然,这种情况很少见,待后续文章讨论。

结束语
php@8当然有很多新的特性了,本文仅仅是演示其中的一小部分。更多php@8的新特性,可以参考苏南大叔php系列文章链接: