PHP7+也支持类型声明了,聊聊这个特性!
最近在研究PHP7的新特性,发现PHP也开始搞类型声明了,这么做的好处很明显:能提高程序运行速度。
下面开始介绍这一新特性:
默认情况下,所有的PHP文件都处于弱类型校验模式。
PHP7+增加了类型声明的特性,类型声明有两种模式:
- 强制模式 (默认模式) 我的理解就是强制转换成需要的类型,不严格区分类型而是强转,类型不一致不报错
- 严格模式 严格校验类型,类型与声明的不一致,报错
标量类型声明语法格式:
declare(strict_types=1);
其中strict_types的值:
- 1表示严格类型校验模式,作用于函数调用和返回语句;
- 0表示弱类型校验模式
可以使用的类型参数有:
- string
- int
- float
- bool
- interfaces
- array
- callable
强制模式(默认模式)
<?php function sum(int ...$ints) { return array_sum($ints); } print(sum(1, '2', 3.1)); ?>
以上程序执行输出结果为:6
分析一下即:将字符串类型的'2'转换成整型的2,将float类型的3.1转换为整型的3后再相加,得出结果6。
严格模式
<?php declare(strict_types=1); function sum(int ...$ints) { return array_sum($ints); } print(sum(1, '2', 3.1)); ?>
以上程序因为采用了严格模式,因为第二个参数不是int类型,执行结果报错如下:
PHP Fatal error: Uncaught TypeError: Argument 2 passed to sum() must be of the type integer, string given, called in……
返回类型声明
PHP7+ 增加了对返回类型声明的支持,返回类型声明指明了函数返回值的类型。
可以声明的返回类型有:
- string
- int
- float
- bool
- interfaces
- array
- callable
我踩的坑
这里我还真趟过坑,在新版本的phpstorm中会根据返回值类型出现提示代码,引导添加返回类型声明,我就加上了。但是后面因为业务的变化或者代码优化只修改了返回值(比如之前返回的是array,修改后返回了int),却忘记了修改返回类型声明(毕竟习惯了PHP弱语言类型这么多年了...),这样是会抛出异常导致报错的,这就是我踩到的坑,小伙们们在使用过程中要注意。
思考
GO语言是不会出现我上面说的问题的, 因为如果返回值类型和返回类型声明是编译不通过的,编译的时候就会报错。
而PHP作为弱类型语言,虽然做了返回类型声明这种优化,但是语言执行前不需要我们编译,直接发布运行,也就不能做到go语言的“编译报警”了,PHP会在执行的时候直接抛出异常。
<?php declare(strict_types=1); function returnIntValue(int $value): int { return $value; } print(returnIntValue(5)); ?>
以上程序执行输出结果为:5
返回类型声明错误示例
<?php declare(strict_types=1); function returnIntValue(int $value): int { return $value + 3.0; } print(returnIntValue(1)); ?>
以上程序由于采用了严格模式,返回值必须是 int,但是计算结果是float,导致报错,执行输出结果为:Fatal error: Uncaught TypeError: Return value of returnIntValue() must be of the type integer, float returned...
void 函数
注意:定义返回类型为 void 的函数不能有返回值,即使返回 null 也不行。
返回值声明为 void 类型的方法要么干脆省去 return 语句,要么使用一个空的 return 语句。
实例
<?php function exchange(&$left, &$right) : void { if ($left === $right) { return; } $tmp = $left; $left = $right; $right = $tmp; } $a = 1; $b = 2; var_dump(exchange($a, $b), $a, $b);
以上实例输出结果:
null int(2) int(1)
原文地址:https://juejin.cn/post/7062942459247984648
作者:王中阳Go
推荐学习:《PHP视频教程》
-
mail.ru是什么邮箱 mail.ru邮箱登录入口 时间:2025-09-10
-
输入gpedit.msc找不到文件的原因及解决方案 时间:2025-09-10
-
nrg是什么格式文件?nrg文件用什么打开? 时间:2025-09-10
-
JavaScript中removeChild删除所有子节点方法详解(附代码) 时间:2025-09-10
-
Java运行时异常(RuntimeException)的原因及解决办法 时间:2025-09-10
-
PHP中随机数生成的方法有哪些(生成随机数的函数) 时间:2025-09-10
今日更新
-
通天排屋梗揭秘:网络热词背后的幽默文化解析
阅读:18
-
通讯兵的梗是什么梗?揭秘战场传令兵爆笑日常,看完笑到信号中断!
阅读:18
-
逆水寒手游社交能量怎么刷-社交能量获取
阅读:18
-
如鸢九月洞窟懒人版-戏学核爆与二星徐庶怎么过
阅读:18
-
最终幻想14新版本9月11日将更新-全新副本来袭
阅读:18
-
世界之外9月10日夏萧因生日更新公告完整版
阅读:18
-
闪暖×开心消消乐联动活动-9月12日更新后开启
阅读:18
-
明日之后感染者驱逐行动明日开启-珍贵奖励惊喜兑换
阅读:18
-
通讯兵梗源自军事幽默 指传递消息时总爱添油加醋的队友 网友调侃现代版传话游戏 笑点在于信息越传越离谱
阅读:18
-
原神月之一版本空月之歌呈示更新公告-完整版公告
阅读:18