• 技术文章 >后端开发 >php教程

    PHP7+也支持类型声明了,聊聊这个特性!

    青灯夜游青灯夜游2022-05-09 21:35:26转载1335
    PHP也开始搞类型声明,PHP7+增加了类型声明的特性,下面本篇文章就来带大家了解一下PHP类型声明特性,分享一下在返回类型声明踩的坑,希望对大家有所帮助!

    最近在研究PHP7的新特性,发现PHP也开始搞类型声明了,这么做的好处很明显:能提高程序运行速度。

    下面开始介绍这一新特性:

    默认情况下,所有的PHP文件都处于弱类型校验模式。

    PHP7+增加了类型声明的特性,类型声明有两种模式:

    标量类型声明语法格式:

    declare(strict_types=1);

    其中strict_types的值:

    可以使用的类型参数有:

    强制模式(默认模式)

    <?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+ 增加了对返回类型声明的支持,返回类型声明指明了函数返回值的类型。

    可以声明的返回类型有:

    我踩的坑

    这里我还真趟过坑,在新版本的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视频教程

    以上就是PHP7+也支持类型声明了,聊聊这个特性!的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:掘金社区,如有侵犯,请联系admin@php.cn删除
    专题推荐:php PHP7
    上一篇:详细介绍php反序列化pop链构造知识点 下一篇:深入浅析PHP文件包含漏洞
    千万级数据并发解决方案

    相关文章推荐

    • 9个杀手级的PHP项目,快来收藏使用!• 详细介绍php反序列化pop链构造知识点• php怎么去掉一维数组的空字段• 一起分析PHP怎么解析JSON数据• thinkphp6教程笔记(总结分享)
    1/1

    PHP中文网