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)


相关文章
|
1天前
|
PHP 开发者
深入理解PHP7中的返回类型声明
【4月更文挑战第25天】本文将详细解析PHP7中新引入的返回类型声明特性,包括其基本用法、使用场景以及可能遇到的问题。通过实例代码,帮助读者深入理解和掌握这一强大的新特性。
|
1天前
|
PHP 开发者
深入理解PHP7的返回类型声明
【2月更文挑战第29天】 在PHP 7中,一个新的特性被引入,即返回类型声明。这是一个强大的工具,它允许开发者明确指定函数或方法应返回的数据类型。本文将探讨这一特性的基本用法,以及如何利用它来提高代码的可读性和健壮性。
|
1天前
|
存储 Go
Golang底层原理剖析之slice类型与扩容机制
Golang底层原理剖析之slice类型与扩容机制
25 0
|
6月前
|
关系型数据库 Go PostgreSQL
golang pgx自定义PostgreSQL类型
golang的pgx驱动提供了大约70种PostgreSQL类型支持,但还是有一些类型没有涵盖,本文介绍如何自己编写代码支持特殊的类型。
87 3
|
7月前
|
安全 Go
Golang 语言的编程技巧之类型
Golang 语言的编程技巧之类型
37 0
|
7月前
|
存储 安全 编译器
Golang 语言中 map 的键值类型选择,它是并发安全的吗?
Golang 语言中 map 的键值类型选择,它是并发安全的吗?
33 0
|
1天前
|
安全 编译器 API
深入理解PHP7中的返回类型声明
【5月更文挑战第12天】 在面向对象编程中,明确函数和方法是关键。而PHP7引入的返回类型声明特性,为开发者提供了一种强大的工具来增强代码的清晰度和可靠性。本文将深入探讨PHP7返回类型声明的概念、用法以及它如何帮助我们编写更加健壮和易于维护的代码。
|
1天前
|
PHP 开发者
深入理解PHP7的返回类型声明
【5月更文挑战第11天】 在PHP 7中,引入了一项新的语言特性 - 返回类型声明。这一特性允许开发者在函数定义时指定预期的返回值类型,从而增强代码的可读性和健壮性。本文将探讨返回类型声明的概念、语法、优势以及在实际开发中的应用,帮助读者更深入地理解并有效运用这一新特性。
|
1天前
|
PHP 开发者
深入理解PHP7的返回类型声明
【4月更文挑战第25天】在PHP7中,引入了返回类型声明,这是一个重要的新特性。本文将详细介绍什么是返回类型声明,以及如何在PHP7中使用它。我们将探讨其基本语法,以及如何使用返回类型声明来提高代码的可读性和健壮性。
|
1天前
|
程序员 API PHP
深入理解PHP7的返回类型声明特性
在PHP7中,引入了返回类型声明这一强大的新特性。不同于以往仅依赖于文档和程序员约定俗成的规则,返回类型声明为函数提供了必要的强制性检查,增强了代码的健壮性和可维护性。本文将深入探讨PHP7中的返回类型声明,从基本语法入手,逐步解析其对代码质量的影响,以及在实际开发中如何高效地利用这一特性。