我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

php本来是属于弱类型的,否则也不会被facebook家的hacklang钻了空子。虽然平时没有谁会给php的函数的参数定义个参数类型,但是实际上php的函数的参数,是可以被定义参数类型的。在php@8系列中,这个参数的可定义的规则,又有了新的变化。那么,本文中,将要带来的就是php@8系列中,有关函数定义方面的新特性。

苏南大叔:php8新特性,关于函数的形参定义方面,有何新特性? - php8函数相关新特性
php8新特性,关于函数的形参定义方面,有何新特性?(图7-1)

苏南大叔的“平行空间笔记本”博客,记录苏南大叔的编程经验总结。本文测试环境:win10nginx@1.15.11php@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

苏南大叔:php8新特性,关于函数的形参定义方面,有何新特性? - 计算运费
php8新特性,关于函数的形参定义方面,有何新特性?(图7-2)

形参多类型方案一【8之前】

php@8之前,如果形参可以有两种类型,比如:intfloat【很常见吧?】。那么,

  • 可以不写形参的类型,回归原始。
  • 定义两个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参数的类型不同。

苏南大叔:php8新特性,关于函数的形参定义方面,有何新特性? - 计算运费2
php8新特性,关于函数的形参定义方面,有何新特性?(图7-3)

形参多类型方案二【8系列】

php@8系列里面,并不需要定义多个函数。因为形参的类型,可以使用或|定义了。

function total4(int $count, int | float $price) {
    return 10 + $count * $price;
}
echo total4(1,10.5);

输出:

20.5

苏南大叔:php8新特性,关于函数的形参定义方面,有何新特性? - 计算运费3
php8新特性,关于函数的形参定义方面,有何新特性?(图7-4)

函数调用实参顺序

对于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);

苏南大叔:php8新特性,关于函数的形参定义方面,有何新特性? - 新的调用方式
php8新特性,关于函数的形参定义方面,有何新特性?(图7-5)

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" }

苏南大叔:php8新特性,关于函数的形参定义方面,有何新特性? - 系统调用代码
php8新特性,关于函数的形参定义方面,有何新特性?(图7-6)

explode()这个函数中,如果两个参数位置倒置了。就会得到错误的结果,然而,在php8系列里面,通过“形参名:”的形式,就可以扭转这个局面。参考文章:

可能存在的问题

其实,这里有个问题,就是如何知道参数的实际名称呢?文档或者工具提示里面可能是错误的哦。比如explode()里面的这个分隔符,官方文档里面一直都是写的叫delimiter,而实际定义的是separator。当然,这种情况很少见,待后续文章讨论。

苏南大叔:php8新特性,关于函数的形参定义方面,有何新特性? - 文档错误
php8新特性,关于函数的形参定义方面,有何新特性?(图7-7)

结束语

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

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php