美文网首页程序开发程序员
2018.06.10 周日--《PHP7--PHP的一次重大变革

2018.06.10 周日--《PHP7--PHP的一次重大变革

作者: 算法成瘾者 | 来源:发表于2018-06-10 20:25 被阅读103次

    一、写在开头


        PHP7是PHP编程语言全新的一个版本,主要在性能方面获得了极大的提升。官方的文档显示,PHP7可以达到PHP5.x版本两倍的性能。同时还对PHP的语法做了梳理,提供了很多其他语言流行的语法格式。难能可贵的是,做了如此大的改动,PHP7的兼容性还是非常好的。对于绝大多数的应用来讲,可以不用做修改即可迁移到PHP7版本。

    PHP7你值得拥有

        有人有疑问,为什么没有PHP6就直接PHP7了呢,实际上PHP6这个项目有过,只是后来取消了,但大量的功能已经在PHP5.x版本中得以实现。所以这一次直接就是PHP7。

    二、PHP7的安装


    使用编译安装太麻烦了,这里提供 Linux下的centos的安装php7的方法:

    1)安装epel:  yum -y install epel-release

    2)更换rpm源,请根据自己的centos版本选择相应的rpm源进行安装:

    Centos 5.X:

        rpm -Uvhhttp://mirror.webtatic.com/yum/el5/latest.rpmCentOs6.x:

        rpm -Uvhhttp://mirror.webtatic.com/yum/el6/latest.rpm

    CentOs 7.X:

        rpm -Uvhhttps://mirror.webtatic.com/yum/el7/epel-release.rpm

    rpm -Uvhhttps://mirror.webtatic.com/yum/el7/webtatic-release.rpm

    3)删除之前的php版本:

    yum remove php * php-common

    4)安装php7: yum install php70w

    5)安装成功并检测: php -v

    三、PHP7的新特性


    1) 标量类型声明: PHP 7 中的函数的形参类型声明可以是标量了,即可以使用 string、int、float和 bool。

    php7性能提升了2倍

    2)NULL 合并运算符: 

    同时使用三元表达式和 isset()的情况,NULL 合并运算符使得变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数。

    <?php

    // 如果 $_GET['user'] 不存在返回 'nobody',否则返回 $_GET['user'] 的值

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

    // 类似的三元运算符

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

    ?>

    4) 太空船操作符(组合比较符)

    3)太空船操作符用于比较两个表达式。当$a大于、等于或小于$b时它分别返回-1、0或1。

    // 整型

    echo 1 <=> 1; // 0

    echo 1 <=> 2; // -1

    echo 2 <=> 1; // 1

    4)通过 define() 定义常量数组

    define('ANIMALS', [

         'dog',

        'cat',

        'bird'

    ]);

    echo ANIMALS[1]; // 输出 "cat"

    ?>


    四、PHP7的修改


    1.【 变量处理机制修改】:

        间接变量、属性和方法引用都按照从左到右的顺序进行解释:

    $$foo['bar']['baz'] // interpreted as ($$foo)['bar']['baz’]

    如果想改变解释的顺序,可以使用大括号:${$foo['bar']['baz’]}

    global关键字现在只能引用简单变量   

    global $$foo->bar;    // 这种写法不支持。

    global ${$foo->bar};  // 需用大括号来达到效果。

    引用赋值时自动创建的数组元素或者对象属性顺序和以前不同了。

    $array = [];

    $array["a"] =& $array["b"];

    $array["b"] = 1;

    var_dump($array);

    PHP7产生的数组:["a" => 1, "b" => 1]

    PHP5产生的数组:["b" => 1, "a" => 1]

    2.【list()修改】

    list()不再按照相反的顺序赋值

    list($array[], $array[], $array[]) = [1, 2, 3];

    var_dump($array);

    上面的代码会返回一个数组:$array == [1, 2, 3] 而不是之前的 [3, 2, 1]

    注意:只是赋值的顺序发生变化,赋的值还是和原来一样的。

    空的list()赋值不再允许。

    list() = $a;

    list()不在支持字符串拆分功能  

    $string = "xy";

    list($x, $y) = $string;

    这段代码最终的结果是:$x == null and $y == null (不会有提示)

    PHP5运行的结果是: $x = "x" and $y = "y”.

    除此之外,list()现在也适用于数组对象:

    list($a, $b) = (object) new ArrayObject([0, 1]);

    PHP7结果:$a == 0 and $b == 1.

    PHP5结果:$a == null and $b == null.

    3.【 foreach 修改】

    foreach()循环对数组内部指针不再起作用。

    $array = [0, 1, 2];

    foreach ($array as &$val)

    {

        var_dump(current($array));

    }

    PHP7运行的结果会打印三次int(0),也就是说数组的内部指针并没有改变。

    之前运行的结果会打印int(1), int(2)和bool(false)

    按照值进行循环的时候,foreach是对该数组的拷贝操作

    foreach按照值进行循环的时候(by-value),foreach是对该数组的一个拷贝进行操作。这样在循环过程中对数组做的修改是不会影响循环行为的。

    $array = [0, 1, 2];

    $ref =& $array; // Necessary to trigger the old behavior

    foreach ($array as $val) {

        var_dump($val);

        unset($array[1]);

    }

    上面的代码虽然在循环中把数组的第二个元素unset掉,但PHP7还是会把三个元素打印出来:(0 1 2)

    之前老版本的PHP会把1跳过,只打印(0 2).

    按照引用进行循环的时候,对数组的修改会影响循环。

    如果在循环的时候是引用的方式,对数组的修改会影响循环行为。不过PHP7版本优化了很多场景下面位置的维护。比如在循环时往数组中追加元素。

    $array = [0];

    foreach ($array as &$val) {

        var_dump($val);

        $array[1] = 1;

    }

    上面的代码中追加的元素也会参与循环,这样PHP7会打印"int(0) int(1)",老版本只会打印"int(0)”。

    4.【参数处理机制修改】

    重复参数命名不再支持

    重复的参数命名不再支持。比如下面的代码执行的时候会报错:

    public function foo($a, $b, $unused, $unused) {

              // ...

    }

    func_get_arg和func_get_args()调整

    func_get_arg()和func_get_args()这两个方法返回参数当前的值,而不是传入时的值。当前的值有可能会被修改   

    function foo($x)

    {

        $x++;

        var_dump(func_get_arg(0));

    }

    foo(1);

    上面的代码会打印2, 而不是1。如果想打印原始的值,调用的顺序调整下即可。

    同样在打印异常回溯信息的时候也是显示修改后的值。

    function foo($x)

    {

        $x = 42;

        throw new Exception;

    }

    foo("string");

    PHP7的运行结果:Stack trace:

    #0 file.php(4): foo(42)

    #1 {main}

    PHP5的运行结果:Stack trace:

    #0 file.php(4): foo('string')

    #1 {main}

    这个调整不会影响代码的行为,不过在调试的时候需要注意这个变化。

    其他和参数有关的函数都是同样的调整,比如debug_backtrace() .

    五、如何升级当前项目代码来兼容PHP7?


    逐步剔除php7不支持的代码

    检测工具:https://github.com/sstalle/php7cc

    检测不兼容PHP7的代码

    六、写在最后


        PHP7 2倍性能飙升,你心动了吗,赶紧下载代码运行吧~

      附录:

    php7官方文档:http://php.net/manual/zh/migration70.new-features.php

    鸟哥的博客:http://www.laruence.com

    相关文章

      网友评论

        本文标题:2018.06.10 周日--《PHP7--PHP的一次重大变革

        本文链接:https://www.haomeiwen.com/subject/ydjqeftx.html