zoukankan      html  css  js  c++  java
  • php7了解一下

      PHP7--PHP的一次重大变革

      一、写在开头

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

    PHP7--PHP的一次重大变革

      有人有疑问,为什么没有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; // 0echo 1 <=> 2; // -1echo 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 behaviorforeach ($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倍性能飙升,你心动了吗,赶紧下载代码运行吧~

  • 相关阅读:
    【已解决】github中git push origin master出错:error: failed to push some refs to
    好记心不如烂笔头,ssh登录 The authenticity of host 192.168.0.xxx can't be established. 的问题
    THINKPHP 5.0目录结构
    thinkphp5.0入口文件
    thinkphp5.0 生命周期
    thinkphp5.0 架构
    Django template
    Django queryset
    Django model
    Python unittest
  • 原文地址:https://www.cnblogs.com/liangdong/p/10235824.html
Copyright © 2011-2022 走看看