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
系列文章链接:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。