PHP7+和Golang一样支持返回类型声明却坑了我一下

简介: PHP作为弱类型语言,没有很多条条框框,写起来比较爽,但是运行速度和对高并发的支持确实不如Go

PHP作为弱类型语言,没有很多条条框框,写起来比较爽,但是运行速度和对高并发的支持确实不如Go。


最近在研究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 的函数不能有返回值,即使返回 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)


相关文章
|
10月前
|
PHP 开发者
深入理解PHP7的返回类型声明
【2月更文挑战第29天】 在PHP 7中,一个新的特性被引入,即返回类型声明。这是一个强大的工具,它允许开发者明确指定函数或方法应返回的数据类型。本文将探讨这一特性的基本用法,以及如何利用它来提高代码的可读性和健壮性。
|
10月前
|
PHP 开发者
深入理解PHP7中的返回类型声明
【4月更文挑战第25天】本文将详细解析PHP7中新引入的返回类型声明特性,包括其基本用法、使用场景以及可能遇到的问题。通过实例代码,帮助读者深入理解和掌握这一强大的新特性。
|
4月前
|
IDE PHP 开发工具
PHP中的类型提示与严格模式:提高代码可维护性
随着PHP语言的发展,开发者对代码的可读性、可维护性和可靠性有了更高的要求。PHP中的类型提示(Type Hinting)和严格模式(Strict Mode)为开发者提供了更强的类型检查机制,有助于提升代码质量和减少潜在的错误,尤其是在大型项目中。
|
5月前
|
SQL 安全 PHP
PHP 自发布以来一直在 Web 开发领域占据重要地位,PHP 8 更是带来了属性、刚性类型等新特性。
【10月更文挑战第1天】PHP 自问世以来,凭借其易用性和灵活性,在 Web 开发领域迅速崛起。从简单的网页脚本语言逐步演进为支持面向对象编程的现代语言,尤其自 PHP 5.3 引入命名空间后,代码组织和维护变得更加高效。PHP 7 的性能优化和 PHP 8 的新特性(如属性和刚性类型)进一步巩固了其地位。框架如 Laravel、Symfony、Yii2 和 CodeIgniter 等简化了开发流程,提高了效率和安全性。
84 2
ly~
|
6月前
|
存储 供应链 小程序
除了微信小程序,PHP 还可以用于开发哪些类型的小程序?
除了微信小程序,PHP 还可用于开发多种类型的小程序,包括支付宝小程序、百度智能小程序、抖音小程序、企业内部小程序及行业特定小程序。在电商、生活服务、资讯、工具、娱乐、营销等领域,PHP 能有效管理商品信息、订单处理、支付接口、内容抓取、复杂计算、游戏数据、活动规则等多种业务。同时,在企业内部,PHP 可提升工作效率,实现审批流程、文件共享、生产计划等功能;在医疗和教育等行业,PHP 能管理患者信息、在线问诊、课程资源、成绩查询等重要数据。
ly~
125 6
|
7月前
|
缓存 前端开发 API
PHP 适合做什么类型的项目
【8月更文挑战第4天】PHP 适合做什么类型的项目
95 4
|
6月前
|
Go
Golang语言基础之接口(interface)及类型断言
这篇文章是关于Go语言中接口(interface)及类型断言的详细教程,涵盖了接口的概念、定义、实现、使用注意事项以及类型断言的多种场景和方法。
63 4
|
6月前
|
Go
Golang语言基础数据类型之字符类型
这篇文章介绍了Go语言中的字符类型,包括字符概述、byte和rune类型的定义、转义字符的使用以及如何遍历字符串获取字符的示例。
31 0
|
9月前
|
存储 安全 PHP
安全开发-PHP应用&文件管理模块&显示上传&黑白名单类型过滤&访问控制&文件管理模块&包含&上传&遍历&写入&删除&下载&安全
安全开发-PHP应用&文件管理模块&显示上传&黑白名单类型过滤&访问控制&文件管理模块&包含&上传&遍历&写入&删除&下载&安全
|
10月前
|
Linux PHP 数据安全/隐私保护
深入理解PHP7的返回值类型声明深入理解 Linux 文件系统的权限管理
【5月更文挑战第30天】在PHP7中,引入了返回值类型声明的特性。这一特性使得开发者可以在函数定义时指定函数应返回的值的类型。本文将详细解析返回值类型声明的用法,以及它在实际开发中的应用,帮助读者更好地理解和使用这一特性。

热门文章

最新文章