Woowen You can do anything you set your mind to, man

PHP7 新特性,改变变化

PHP7 新特性,改变变化

12月3号,PHP7发布正式版,让我们来看看他的变化

性能提升

国外对于PHP5和PHP7的性能测试图

img

国外对于PHP5和PHP7的各个主流框架性能测试图

img

img

主要变化

1.PHP7的效率比PHP5.6快了一倍

2.支持64位系统

3.修复一些致命错误,将返回异常

4.移除了一些不再支持的老拓展,以及SAPI

5.新的运算符 <=>

6.新的运算符 ??

7.可以强制限制入参类型,以及返回值类型

8.支持匿名类

9.优化命名空间引用

新的运算符

新的飞碟运算符 <=>
比较各个操作数,如果左边大,返回1,相等返回0,右边大,返回-1
<?php
    // Integers
    echo 1 <=> 1; // 0
    echo 1 <=> 2; // -1
    echo 2 <=> 1; // 1

    // Floats
    echo 1.5 <=> 1.5; // 0
    echo 1.5 <=> 2.5; // -1
    echo 2.5 <=> 1.5; // 1

    // Strings
    echo "a" <=> "a"; // 0
    echo "a" <=> "b"; // -1
    echo "b" <=> "a"; // 1
?>
新的运算符 ??
<?php
    $c = $a ?? 'TEST';
    echo $c; // TEST

    $a = 'test';
    $c = $a ?? 'TEST';
    echo $c; // test
?>
强制限制入参类型,以及返回值类型
<?php
    // 可以插入多个参数
    function a(int ...$ints){
        return $ints;
    }
    print_r(a(1,2,5,'33'));

    // 返回
    Array
    (
        [0] => 1
        [1] => 2
        [2] => 5
        [3] => 33
    )
?>
可以强制指定返回值类型
<?php
    // 如果类型不匹配将会返回异常
    function a() : array{
        return [];
    }

    // PHP5
    function sum($a, $b){
        return $a + $b;
    }
    var_dump(sum(1, 2)); // 返回int(3)

    // PHP7
    function sum($a, $b): float {
        return $a + $b;
    }
    var_dump(sum(1, 2)); // 返回float(3)
?>  
类型声明有2种模式,强制模式(默认)和严格模式
严格模式: 使用declare(strict_types=1);声明
如果指定使用严格模式,这个指令不仅影响参数的类型声明,也会影响函数的返回值类型,且是基于文件可配的,且如果declare结构的文件被其他文件所引用包含,那么指令对包含他的父文件不起作用

注:

你可以使用declare(ticks = 1);

或者

<?php
    declare(ticks = 1){

    }
?>

但是对于strict_types block 的形式是无效的,即你不能使用

<?php
    // 系统会报错
    declare(strict_types=1){

    }
?>  

模式选择必须在文件的第一行,不然会报错提示

<?php
    declare(strict_types=1);
    function sum($a, $b): int {
        return $a + $b;
    }

    // 当使用严格模式的时候 将会返回 int(3)
    var_dump(sum(1, 2));
?>

而当你使用严格模式,并且返回值不是规定类型的时候,将会报错

返回值类型也可以是对象

<?php
    class a{}

    function b() : a{
        return new a;
    }

    var_dump(b());exit; //返回对象
?>
支持匿名类
<?php
    function b($a){
        return $a;
    }
    var_dump(b(new class{

    }));

    // return object(class@anonymous)#1 (0) {}

    function b($a){
        return $a;
    }
    var_dump(b(new class{

        function b(){
                return 'ff';
        }

    })->b());

    // return string(2) "ff"
?>
优化命名空间引用
<?php   
    // php5
    use a\b\c\d;
    use a\b\c\e;
    use a\b\c\f;
    // php7
    use a\b\c\{d,e,f};
?>
清理许多不用,过时的api,拓展

具体: http://php.net/manual/zh/migration70.removed-exts-sapis.php

其他

1.可以使用define定义数组别名

<?php

    define('ANIMALS', [
        'dog',
        'cat',
        'bird'
    ]);

    echo ANIMALS[1]; // outputs "cat"
?>

2.新增IntlChar类 主要是用来操作多字符集额unicode字符 不过需要安装拓展,就不细说了

3.asset()现在是一个语言结构,而非方法

4.生成器可以在方法中返回,并且遍历出来.

<?php
    $gen = (function() {
        yield 1;
        yield 2;
        return 3; // php5.5中如果在yield后面跟着return,那么在语法分析的时候就会出错
    })();

    foreach ($gen as $val) {
        echo $val, PHP_EOL;
    }

    echo $gen->getReturn();

    // 输出 
    1
    2
    3

    // 如果没有getReturn();
    // 那么输出
    1
    2
?>
yield 关键字是php5.5新增的.可以去看下5.5的新features:

http://php.net/manual/en/migration55.new-features.php

具体就是当程序执行到yield的时候返回值,然后在yield位置继续执行.而如果使用for或者foreach遍历的时候,每个迭代的中间过程,都会有一个中间变量,每个变量都会占用内容空间,而且分配内容,释放内存都会导致程序运行时间边长,如果使用yield的话,那么所有的中间变量都使用一个内存,那么时间,空间都会变小
生成器代理(delegation) 也可以叫生成器委托
<?php
    gen = (function() {
        yield 1;
        yield 2;
        yield from b();
    })();

    function b(){
       yield 3;
       yield 4;
    }

    foreach ($gen as $val) {
        echo $val, PHP_EOL;
    }
    // 输出
    1
    2
    3
    4
?>

5.新增intdiv方法,取参数1 除以参数2 然后取整

<?php
    // 增加了新的intdiv方法
    echo intdiv(5,10),PHP_EOL;
    echo intdiv(5,-10),PHP_EOL;
    echo intdiv(-5,10),PHP_EOL;
    echo intdiv(-5,-10),PHP_EOL;

    echo intdiv(10,5),PHP_EOL;
    echo intdiv(10,-5),PHP_EOL;
    echo intdiv(10,2),PHP_EOL;
    echo intdiv(10,3),PHP_EOL;

    echo intdiv(9,3),PHP_EOL;
    echo intdiv(33,3),PHP_EOL;
    echo intdiv(34,3),PHP_EOL;

    // 输出
    0
    0
    0
    0
    2
    -2
    5
    3
    3
    11
    11
?>

6.新增方法随机字节random_bytes

在windows环境下,会使用CryptGenRandom() 生成:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa379942(v=vs.85).aspx

在linux环境下,使用 getrandom(2) 方法生成:

http://man7.org/linux/man-pages/man2/getrandom.2.html

其他平台,使用/dev/urandom命令生成

7.新增方法随机数字random_int

8.修复list不能正确遍历 一个继承ArraryAccess接口的对象的问题

9.ASP的元素标签被移除,不能再使用<% <%=以及<script language="php”>

10.PHP7中在switch语句中不能出现多个default,而php5可以,并且会执行最后一个

<?php
    switch ($expr) {
        default:
             echo "Hello PHP5";
             break;
        default:
             echo "Hello PHP7";
             break;
    }

    // PHP7中,上述语句会报错,而PHP5中输出,Hello PHP7
?>  

11.PHP5,PHP7中一些语法差异

<?php

    class Person
    {
       public $name = 'Woowen';
    }

    $person = new Person();
    $property = [ 'first' => 'name', 'second' => 'property'];
    $name = '11';

    // PHP5中等于$person->{$property['first']}
    echo $person->$property['first'] . PHP_EOL;
    echo $person->name.PHP_EOL;
    // PHP7 其实等于{$person->$property}['first']
?>

PHP7中运行正常,PHP5直接语法解析出错

<?php
    class Person
    {
       public static $company = 'mogu';
       public function department()
       {
           return [
               'part1' => function () {
                   return 'uni1';
               },
               'part2' => function () {
                   return 'uni2';
               }
           ];
       }

       public function getDepartOf($part)
       {
           return $this->department()[$part];
       }
    }
    $person = new Person();
    echo $person->department()['part1']();
    echo $person->getDepartOf('part2')();

    // PHP7 输出
    uni1
    uni2

    // PHP5 直接语法出错
?>

更多变化,就要靠大家自己去摸索了.PHP7还是很期待的

Woowen 浙ICP备15013647号