• PHP7 新特性


    一、概况

    PHP 7是PHP一个非常重要的版本,相对于PHP 5.x版本,有着非常大的革新,尤其是在性能方面。如果读者的网站使用的是PHP 5.x,那么使用PHP 7后几乎将无成本地得到一倍的性能提升。

    二、新特性

    PHP 7除了在性能方面有极大提升外,还添加了很多新的特性,如太空船操作符、标量类型声明、返回值的类型声明、全局的throwable接口、抽象语法树等。

    (1)太空船操作符

    <?php
    /**
     * 太空船操作符用于比较两个表达式。
     * 例如,当$a小于、等于或大于$b时,它分别返回-1、0或1。
     */
    echo 1 <=> 2; // -1

    (2)标量类型声明和返回值的类型声明

    /**
     * PHP 7可以对下面几种类型的参数做声明:
     * 字符串(string)、整型(int)、浮点型(float)以及布尔型(bool)。
     * 注意参数类型声明不受制于默认模式和严格模式。
     * 默认模式下,当传入的参数不符合声明类型时,
     * 会首先尝试转换类型(注意:这里的类型转换仅受制于可转换的类型,
     * 例如不能把'a'转为int型。);
     * 而严格模式下,则直接报致命错误。
     *
     * PHP 7.1对函数返回值的声明做了扩充,
     * 可以定义其返回值为void,即不能有返回值,
     * 无论是否开启严格模式,只要函数中有 “return;” 以外的其他return语句都会报错。
     *
     * PHP 7.1.0对参数类型和返回值类型还有进一步的支持,
     * 其类型可以是可空类型,
     * 在参数或返回值类型声明前边加上“?”,表示返回值要么是null,要么是声明的类型
     */
    
    declare(strict_types=1); // 开启严格模式
    
    function say(int... $ints): void
    {
        return;
    }
    
    function say2(?string $worlds): ?string
    {
        return $worlds;
    }
    
    echo '<pre>';
    var_dump(say(1, 2, 3));
    var_dump(say2(null));
    var_dump(say2("hello world!"));
    var_dump(say2(123)); // 致命错误

    (3)null合并操作符

    /**
     * PHP 7提供了一个新的语法糖“??”,
     * 如果变量存在且值不为null,它会返回自身的值,否则返回它的第二个操作数。
     */
    echo isset($_GET['name']) ? $_GET['name'] : 0,'<br>';
    echo $_GET['name'] ?? 0,'<br>';
    echo $_GET['name'] ?? $_GET['age'] ?? 0;

    (4)常量数组

    /**
     * 在PHP 7之前是无法通过define来定义一个数组常量的,PHP 7支持了这个操作
     */
    define('HABBIES', ['eat', 'drink', 'play']);
    
    echo '<pre>';
    var_dump(HABBIES);

    (5)namespace批量导入

    <?php
    
    use SpaceClassA;
    use SpaceClassB;
    use SpaceClassC as C;
    
    // 在PHP 7中支持批量导入:
    use Space{
        ClassA,
        ClassB,
        ClassC as C
    };

    (6)throwable接口

    <?php
    /**
     * 在PHP 7之前,如果代码中有语法错误,或者fatal error时,程序会直接报错退出,但是在PHP 7中有了改变。
     * PHP 7实现了全局throwable接口,原来的Exception和部分Error实现了该接口。
     * 这种Error可以像Exception一样被第一个匹配的try/catch块捕获。
     * 如果没有匹配的catch块,则调用异常处理函数进行处理。
     * 如果尚未注册异常处理函数,则按照传统方式处理(fatal error)。
     *
     * Error类并非继承自Exception类,所以不能用catch(Exception $e){...}来捕获Error。
     * 可以用catch(Error $e){...},或者通过注册异常处理函数(set_exception_handler())来捕获Error
     */
    
    echo '<pre>';
    try {
        undefindfunc();
    } catch (Error $e) {
        var_dump($e);
    }
    //
    set_exception_handler(function ($e) {
        var_dump($e);
    });
    undefindfunc();

    (7)Closure::call()

    <?php
    /**
     * 在PHP 7之前,我们需要动态地给一个对象添加方法时,
     * 可以通过Closure来复制一个闭包对象,并绑定到一个$this对象和类作用域
     * 
     * 在PHP 7中新添加了Closure::call(),
     * 可以通过call来暂时绑定一个闭包对象到$this对象并调用它
     */
    class Test
    {
        private $num = 1;
    }
    
    $f = function() {
        return $this->num + 1;
    };
    
    $test = $f->bindTo(new Test, 'Test');
    echo '<pre>';
    echo $test(),'<br>';
    // php7
    echo $f->call(new Test);

    详见:https://www.cnblogs.com/cshaptx4869/p/10775068.html

    (8)intdiv函数

    PHP 7还增加了一个新的整除函数,在代码中不需要再手动转了。

    (9)list的方括号写法

    <?php
    $arr = [1, 2, 3];
    list($a, $b, $c) = $arr;
    // php7 注意:这里的[]并不是数组的意思,只是list的简略形式。
    [$a1, $b, $c] = $arr;

    除了上述这些,PHP7还有很多其他的改变和特性。

    例如,foreach遍历数组时不再修改内部指针、移除了ASP和script PHP标签、移除了$HTTP_RAW_POST_DATA、匿名类、类常量可见性等。

     

  • 相关阅读:
    linux下的usb抓包方法【转】
    一个脚本和一个容易疏忽的问题strcmp、strncmp、memcmp的用法【原创】
    牛人博客网址
    linux设备驱动之USB主机控制器驱动分析 【转】
    Linux内核跟踪之syscall tracer 【转】
    Linux内核跟踪之trace框架分析【转】
    该怎样选择框架?
    git 解决冲突的办法
    volley源代码解析(七)--终于目的之Response&lt;T&gt;
    WebLogic(12C)——Server
  • 原文地址:https://www.cnblogs.com/cshaptx4869/p/10824254.html
Copyright © 2020-2023  润新知