工作生活

PHP7新增特性和改变

2019-07-04  本文已影响0人  机智的老刘明同志

新增特性和改变:   

    1.declare(strict_type=1);   

        如果不开启strict_type,PHP将会尝试帮你转换成要求的类型,而开启之后,会改变PHP就不再做类型转换,类型不匹配就会抛出错误

    2. 更多的Error变为可捕获的Exception

        比如调用一个不存在的函数

    3.加入了AST(抽象语法树)

        ①什么是AST?

        例如:result = 6 + 7 * 3 用抽象语法树表示

        ②什么是opcodes? 

        Opcode是一种PHP脚本编译后的中间语言,就像Java的ByteCode,或者.NET的MSL

=

        ③从 php 脚本到 opcodes 的执行的过程 

        PHP5:

            Lexing:词法扫描分析,将源文件转换成 token 流;

            Parsing:语法分析,在此阶段生成 op arrays。

        PHP7:

            Lexing:词法扫描分析,将源文件转换成 token 流;

            Parsing:语法分析,从 token 流生成抽象语法树;

            Compilation:从抽象语法树生成 op arrays。

        ④为什么要用AST?

        从以上的步骤来看,这比之前的过程还多了一步,所以按常理来说这反而会增加程序的执行时间和内存的使用。但事实上内存的使用确实增加了,但是执行时间上却有所降低。

        如果仅仅是时间上的优化,似乎也不是使用 AST 的充足理由。其实实现 AST 并不是基于时间优化上的考虑,而是为了解决语法上的问题。

        yield 不需要括号

        括号不影响行为

        list() 的变化

        引用赋值的顺序

        __clone 方法可以直接调用

    4.新增操作符号 ??  <=>

        $c = $a <=> $b

        如果$a > $b, $c 的值为1

        如果$a == $b, $c 的值为0

        如果$a < $b, $c 的值为-1

        ??

        $username = isset($_GET['user]) ? $_GET['user] : 'nobody';

        $username = $_GET['user'] ?? 'nobody';

    5.define() 定义常量数组 

        define('ARR',['a','b']);

        echo ARR[1];// a

    6.匿名函数

        $anonymous_func = function(){return 'function';};

        echo $anonymous_func(); // 输出function

    7.Unicode字符格式支持(echo “\u{9999}”)

    8.命名空间引用优化

        // PHP7以前语法的写法

        use FooLibrary\Bar\Baz\ClassA;

        use FooLibrary\Bar\Baz\ClassB;

        // PHP7新语法写法

        use FooLibrary\Bar\Baz\{ ClassA, ClassB};

    9.Unserialize 提供过滤特性



上一篇下一篇

猜你喜欢

热点阅读