美文网首页
更新到PHP 7吧

更新到PHP 7吧

作者: ngsh | 来源:发表于2016-07-11 00:11 被阅读0次

    PHP 7已经发布了不短的时间,也是PHP社区10多年来最激动人心的更新。新的引擎Zend Engine 3的“卖点”中最重要的就是性能、速度的提升。尽管引入了一些向后不兼容的更改,但是绝逼值得我们升级。

    2016年7月10日(就在今天),官方的PHP5.5.X的版本前面就开始有一个“Old”开头了,按计划今年8月28日,5.6.X也不再更新了。

    尽管有一些breaking changes,但是从5.5、5.6升到7,仍要比5.2升到5.3容易的多。熟悉PHP的开发者都知道为什么PHP会直接从v5跳到v7,v6想加入原生的Unicode支持,其实还有5.3就有的Closures以及Namespace等的特性,但是大约5年的时间最后都没有完成。最终标榜性能的分支phpng以PHP 7的身份公布于众。

    下面我要给大家列一下PHP有哪些更新:

    移除了不再建议使用的特性:

    这些特性在使用的时候如果开启的错误级别较高的话,会触发E_DEPRECATED错误,PHP7将大量的特性直接移除不再能使用。

    • 请更新逻辑和页面混合的老页面,移除不兼容的东西。

      //PHP script tags
      <script language='php'>
          // code
      </script>
      
      //PHP ASP tags
      <%
      // code
      %>
      Short tags
      <%=$str; %>
      

      这些都不再支持,都改成<?php,<?=?>

    • 更新POSIX-Compatible Regular Expressions
      移除ereg拓展,移除下面的函数
      ereg(),eregi(),ereg_replace(),eregi_replace(),split(),spliti(),sql_regcase().

    • 移除多个switch语句中default cases,之前的PHP是允许声明多个default cases,并且只有最后一个case执行。

      switch($me) {
          default:
              echo 'ngshell';
              break;
          default:  // only this execute
              echo 'Yap';
              break;
      }
      
    • 移除了ext/mysql拓展,也就是说mysql_开头的函数都不再可用。你可以用ext/mysqli替换,当然支持用PDO。它们都支持prepared statements和调用stored procedures, 并且最重要的是支持sql占位符,更容易预防sql注入,更加安全。

    一致变量语法

    这个特性是针对构建复杂动态的表达式的时候如何解析所提出来的。

    • 类似$$ng['shell'] 该表达式改如何解析呢?
    Expr PHP5 PHP7
    $$ng['shell'] ${$ng['shell']} ($$ng)['shell']
    $ng->$shell['ngshell'] $ng->{$shell['ngshell']} ($ng->$shell)['ngshell']
    $ng->$shell['ngshell']() $ng->{$shell['ngshell']}() ($ng->$shell)['ngshell']()
    NgClass::$shell['ngshell'] NgClass::{$shell['ngshell']} (NgClass::$shell)['ngshell']
    • Dereferencing任何有效的表达式
    // access a array key
    (expression)['ngshell']
    // access a property
    (expression)->ngshell
    // call a method
    (expression)->ngshell()
    // access a static property
    (expression)::$ngshell
    // call a static property
    (expression)::ngshell()
    // call a callable
    (expression)()
    // access a char
    (expression){0}
    
    // dereferencing scalars
    ['classname', 'staticMethod']()
    [$ngshellObj, "method"]()
    'className'::staticMethod();
    

    这些新的魔法的引进可能引发老代码很难调试的bug, 但是随着PHP7的普及,老的、写法不规范的会大量减少。

    基本语言的改变

    • 空组合操作符 ??
    // PHP 7 before
    $ngshell = isset($_GET['ngshell']) ? $_GET['ngshell'] : 'shell';
    // PHP 7
    $ngshell = $_GET['ngshell'] ?? 'shell';
    // fall-through 
    $ngshell = $_GET['ngshell'] ?? $_GET['shell'] ?? 'shell';
    
    • 联合比较操作符 (宇宙飞船操作符)
    //PHP中第一个3位操作符。
    // not return true or false, but -1, 0 or 1
    // PHP 7 before
    function sort_by_ngshell($a_shell, $b_shell) {
      return ($a_shell < $b_shell) ? -1 : (($a_shell > $b_shell) ? 1 : 0)
    }
    // PHP 7
    function sort_by_ngshell($a_shell, $b_shell) {
      return $a_shell <=> $b_shell;
    }
    
    • 常量数组
    define('shells', ['bash', 'fish', 'ksh', 'csh', 'zsh']);
    echo shells[0];
    
    const ngshell = ['ngshell'];
    echo ngshell[0];
    
    • list() 解包实现ArrayAccess接口的对象
    $array_like_obj = new ArrayObject(['bash', 'ngshell']);
    list(, $ngshell) = $array_like_obj;
    echo $ngshell;
    
    • 新的函数
    // intdiv()
    var_dump(intdiv(3, 2));
    //preg_replace_callback_array()
    $bad_name = 'Ng-shell';
    $new = preg_replace_callback_array(
        [   
            '/^(\w+)-/' => function($matches) { return strtolower($matches[0]); },
            '/-/' => function($matches) { return ''; },
        ], 
        $bad_name
    );
    echo $new;
    // random_bytes() 和 random_int()
    random_bytes(16)
    random_int(0, 123456)
    
    • 旧函数的改变
    // session_start()
    session_start([
        'use_strict' => true;
        'lazy_write' => false;
    ])
    //加强安全的unserialize()
    //dirname()
    $path = '/shell/ngshell';
    echo dirname($path, 2); // path: /
    // password_hash() function deprecate salt parameter.
    

    更可控的assertions

    1. 断言开启 2.断言关闭,可执行 3. 断言不回被编译0耗性能

    更新了异常和错误的集成结构 加入了Throwable, 越来越像java。

    Unicode 增强

    PHP6夭折,不能说明php不支持unicode。

    需要安装int扩展。

    echo IntlChar::charName("\u{2603}");
    

    Closure 增强

    5.3开始支持Closure,5.4支持提前绑定$this, 引进实例方法Closure->bindTo()和静态方法Closure::bind() 两个方法其实是一样的,只是调用方式不一样。第二个方法很重要因为我们能动态改变Closure域。PHP7引进了实例方法Closure->call(),了解javascript的同学很容易理解。如下:

    class Ngshell {
      private $version = '0.0.1';
    }
    
    $bindGeter = function($that) {
      echo $that . ':' . $this->version;
    };
    
    $ngshell = new Ngshell();
    
    $bindGeter->call($ngshell, 'NGSHELL');
    // NGSHELL:0.0.1
    

    Generator 增强

    Generator是在PHP5.5的时候引入的,也是我特别喜欢的一个特性。面试的时候发现居然好多人都没听过 : )
    PHP7支持return语句,并且可以用Generator->getReturn()方法得到该值。还有支持Generator生成其他Generator。

    面向对象的一些变更

    不建议使用PHP4的构造函数,未来会彻底移除。

    • Group use声明语句
    use Ngshell\Router;
    use Ngshell\ORM;
    use Ngshell\View;
    
    use Ngshell\{
      Router,
      ORM,
      View,
      function ngshell,
      const NGSHELL
    };
    
    • 支持匿名class
    $ngObject = new class($args) extends Ng implements Shell {
      use Ngshell;
    }
    

    类型提示

    PHP7最动人的一点无疑是标量类型提示,当然类型提示还包括return类型,严格类型等。

    • 5.0 class/interface 类型提示
    • 5.1 array 类型提示
    • 5.4 callback 类型提示
    • 7.0 bool, float, int, string
    function ngshell(bool $b, float $f, int $i, string $s) {
      // code
    }
    
    • 类型强制
    function setHeader(int $statusCode, string $message) {
      header('HTTP/1.1 ' . $statusCode . ' ' . $message);
    }
    setHeader(404, 'Not Found');
    setHeader('200', 'OK'); // '200' 强制为 200
    setHeader(502.98, 'Bad Gateway'); // 强制为 502,随在此处合理,但证明了类型强制会失去精度。
    
    //严格类型模式
    declare(strict_types=1) 
    namespace Ngshell\StrictTypes;
    setHeader(502.98, 'Bad Gateway'); // 抛出\TypeError 异常
    
    • 返回值类型提示
    function add(int $a, int $b): int {
      return $a + $b;
    }
    

    结束语

    目前7.1都已经出了,大家赶紧升级吧!期待PHP发展越来越好,期待着PHP阵营加入更多的开发者。有好的社区才有好的未来。

    相关文章

      网友评论

          本文标题:更新到PHP 7吧

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