zoukankan      html  css  js  c++  java
  • PHP7特性概览

    了解了PHP7的一些特性,搭建PHP7源码编译环境,并运行官网这些新特性的代码。


    在64位平台支持64位integer

    在64位平台支持64位integer,长度为2^64-1 字符串。

    更详细查看

    抽象语法树

    抽象语法树是语法分析之后产物,忽略了语法细节,是解释前端和后端的中间媒介。新增抽象语法树,解耦语法分析和编译,简化开发维护,并为以后新增一些特性,如添加抽象语法树编译hook,深入到语言级别实现功能。

    更详细查看

    闭包this绑定

    新增Closure::call,优化Closure::bindTo(JavaScript中bind,apply也是一样的应用场景)。

    <?php
    class Foo { private $x = 3; }
    $foo = new Foo;
    $foobar = function () { var_dump($this->x); };
    $foobar->call($foo); // prints int(3)
    

    2-3行新建Foo的对象,第4行创建了一个foobar的闭包,第5行调用闭包的call方法,将闭包体中的$this动态绑定到$foo并执行。

    同时官网上进行性能测试,Closure::call的性能优于Closure::bindTo

    更详细查看Closure::call

    简化isset的语法糖

    从使用者角度来说,比较贴心的一个语法糖,减少了不必要的重复代码,使用情景如:

    <?php
    // PHP 5.5.14
    $username = isset($_GET['username']) ? $_GET['username'] : 'nobody';
    // PHP 7
    $username = $_GET['username'] ?? 'nobody';
    

    在服务器端想获取$_GET中的变量时,若是PHP5语法,需要使用?:操作符,每次要重写一遍$_GET['username'],而在PHP7就可以使用这个贴心的语法糖,省略这个重复的表达式。

    更详细查看isset_ternary

    yield from

    允许Generator方法代理Traversable的对象和数组的操作。这个语法允许把yield语句分解成更小的概念单元,正如利用分解类方法简化面向对象代码。
    例子:

    <?php
    function g1() {
      yield 2;
      yield 3;
      yield 4;
    }
     
    function g2() {
      yield 1;
      yield from g1();
      yield 5;
    }
     
    $g = g2();
    foreach ($g as $yielded) {
        print($yielded);
    }
    // output:
    // 12345
    

    yield from后能跟随GeneratorArray,或Traversable的对象。

    更详细查看generator delegation

    匿名类

    <?php
    class Foo {}
     
    $child = new class extends Foo {};
     
    var_dump($child instanceof Foo); // true
    

    更详细查看anonymous class

    标量类型声明

    <?php
    declare(strict_types=1);
    function add(int $a, int $b): int {
        return $a + $b;
    }
    
    var_dump(add(1, 2)); // int(3)
    // floats are truncated by default
    var_dump(add(1.5, 2.5)); // int(3)
     
    //strings convert if there's a number part
    var_dump(add("1", "2")); // int(3)
    

    更详细查看

    返回值类型声明

    <?php
    function get_config(): array {
        return [1,2,3];
    }
    var_dump(get_config());
    
    function &get_arr(array &$arr): array {
        return $arr;
    }
    $arr = [1,2,3];
    $arr1 = get_arr($arr);
    $arr[] = 4;
    // $arr1[] = 4;
    var_dump($arr1 === $arr);
    

    更详细查看return_types

    3路比较

    一个语法糖,用来简化比较操作符,常应用于需要使用比较函数的排序,消除用户自己写比较函数可能出现的错误。分为3种情况,大于(1),等于(0),小于(-1)。

    <?php
    function order_func($a, $b) {
        return $a <=> $b;
    }
    echo order_func(2, 2); // 0
    echo order_func(3, 2); // 1
    echo order_func(1, 2); // -1
    

    导入包的缩写

    <?php
    import shorthand
    Current use syntax:
     
    use SymfonyComponentConsoleHelperTable;
    use SymfonyComponentConsoleInputArrayInput;
    use SymfonyComponentConsoleOutputNullOutput;
    use SymfonyComponentConsoleQuestionQuestion;
    use SymfonyComponentConsoleInputInputInterface;
    use SymfonyComponentConsoleOutputOutputInterface;
    use SymfonyComponentConsoleQuestionChoiceQuestion as Choice;
    use SymfonyComponentConsoleQuestionConfirmationQuestion;
     
    // Proposed group use syntax:
     
    use SymfonyComponentConsole{
      HelperTable,
      InputArrayInput,
      InputInputInterface,
      OutputNullOutput,
      OutputOutputInterface,
      QuestionQuestion,
      QuestionChoiceQuestion as Choice,
      QuestionConfirmationQuestion,
    };
    

    更详细查看

  • 相关阅读:
    高阶函数
    如何理解data URL?
    JS对象的创建方式
    数组中的map方法
    奇怪的 Javascript
    什么场景不适合箭头函数
    协方差矩阵学习[转载]
    PAT 1140 Look-and-say Sequence [比较]
    PAT 1089 Insert or Merge[难]
    PAT 1096 Consecutive Factors[难]
  • 原文地址:https://www.cnblogs.com/pier2/p/php7-new-features.html
Copyright © 2011-2022 走看看