zoukankan      html  css  js  c++  java
  • 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 命令——48 watch (转)
    linux 命令——47 iostat (转)
    linux 命令——46 vmstat(转)
    linux 命令——45 free(转)
    linux 命令——44 top (转)
    linux 命令——43 killall(转)
    linux 命令——42 kill (转)
    linux 命令——41 ps(转)
    linux 命令——40 wc (转)
    Java for LeetCode 068 Text Justification
  • 原文地址:https://www.cnblogs.com/cshaptx4869/p/10824254.html
Copyright © 2011-2022 走看看