PHP5.4.x至PHP7.1.x的新特性

5.4.x  到  5.5.x

新特性:

1. 新增 Generators

Support for generators has been added via the yield keyword. Generators provide an easy way to implement simple iterators without the overhead or complexity of implementing a class that implements the Iterator interface.

<?php
function xrange($start, $limit, $step = 1) {
    for ($i = $start; $i <= $limit; $i += $step) {
        yield $i;
    }
}

echo 'Single digit odd numbers: ';

/* 注意保存在内存中的数组绝不会被创建或返回 */ 
foreach (xrange(1, 9, 2) as $number) {
    echo "$number ";
}
?>

2. 新增 finally关键字

try-catch blocks now support a finally block for code that should be run regardless of whether an exception has been thrown or not.

<?php
function inverse($x) {
    if (!$x) {
        throw new Exception('Division by zero.');
    }
    return 1/$x;
}

try {
    echo inverse(5) . "\n";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
} finally {
    echo "First finally.\n";
}

try {
    echo inverse(0) . "\n";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
} finally {
    echo "Second finally.\n";
}

// Continue execution
echo "Hello World\n";
?>

3. foreach 现在支持list()

<?php
$array = [
    [1, 2],
    [3, 4],
];

foreach ($array as list($a, $b)) {
    echo "A: $a; B: $b\n";
}
?>

4. empty() 支持任意表达式

empty() 现在支持传入任意表达式,而不仅是一个变量。如:

<?php
function always_false() {
    return false;
}

if (empty(always_false())) {
    echo 'This will be printed.';
}

if (empty(true)) {
    echo 'This will not be printed.';
}
?>

5.5.x  到 5.6.x

新特性:

1. 可以使用表达式定义常量,及函数参数默认值。

2. 可以定义常量数组了: const ARR = ['a', 'b']

3. 可以使用 ...运算符定义变长参数函数了。

使用 ...运算符 将参数展开

4.  使用 **  进行幂运算

5. use  function;

     use  const

6. 可以多次打开并读取php://input

7. __debugInfo();  当使用var_dump() 输出对象时,可以用来控制要输出的属性和 值

新增加的函数

mysqli_get_links_stats()

session_abort()

session_reset()

5.6 至  7 :

不兼容的地方:

1. 错误和异常处理:

在 PHP 7 中,很多致命错误以及可恢复的致命错误,都被转换为异常来处理了。 这些异常继承自 Error 类,此类实现了 Throwable 接口

    $array=[0,1,2];
    foreach($array as &$val){
        var_dump(current($array));
    }


//int(0)
//int(0)
//int(0)

2. foreach 通过值遍历时,操作的值为数组的副本

foreach 通过引用遍历时,有更好的迭代特性

当使用引用遍历数组时,在 foreach迭代能更好的跟踪变化

    $array = [0];
    foreach ($array as &$val) {
    //foreach ($array as $val) {
        var_dump($val);
        $array[1] = 1;
    }

int(0)
int(1)
或:
int(0)

3. 十六进制字符串不再被认为是数字

var_dump("0x123" == "291");       //bool(false)

var_dump(is_numeric("0x123"));    //bool(false)

//var_dump("0xe" + "0x1");            //报错

//var_dump(substr("foo","0x1"));      //报错

 

4.  所有ereg 系列函数被删掉了, PCRE作为推荐的替代品

5.  yield 变更为右联接运算符

6. 在函数中检视参数值会返回 当前 的值:

当在函数代码中使用 func_get_arg() 或 func_get_args() 函数来检视参数值, 或者使用 debug_backtrace() 函数查看回溯跟踪, 以及在异常回溯中所报告的参数值是指参数当前的值(有可能是已经被函数内的代码改变过的值), 而不再是参数被传入函数时候的原始值了。

    function foo($x) {
        $x++;
        var_dump(func_get_arg(0));
    }

    foo(1);

    //int(2)

7. 不再提供 $HTTP_RAW_POST_DATA 变量。 请使用 php://input 作为替代。

8.  在 INI 文件中,不再支持以 # 开始的注释行, 请使用 ;(分号)来表示注释。

9. JSON 扩展已经被 JSOND 取代; 另外,空字符串不再被视作有效的 JSON 字符串

10.  在循环或者 switch 语句之外使用 break 和 continue 被视为编译型错误(之前视为运行时错误),会引发 E_COMPILE_ERROR 错误。

新特性:

1. 标量类型声明:

string; int ;  float;  bool;

返回值类型声明:

2. null 合并运算符: ??

如果变量存在且值不为 NULL, 它就会返回自身的值,否则返回它的第二个操作数。

3. 太空船操作符: <=>

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

5.  匿名类:

现在支持通过 new class  来实例化一个匿名类,这可以用来替代一些“用后即焚”的完整类的定义

6.  Closure::call()

    class A {private $x = 1;}

// PHP 7 之前版本的代码
    $getXCB = function() {return $this->x;};
    $getX = $getXCB->bindTo(new A, 'A'); // 中间层闭包
    echo $getX();

// PHP 7+ 及更高版本的代码
    $getX = function() {
        return $this->x;
        //return 2;
    };
    echo $getX->call(new A);

    //$getX();

7. 从同一 namespace 导入的类,函数,和常量现在可以通过单个use 语句一次性导入了

// PHP 7 之前的代码
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;

use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;

use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;

// PHP 7+ 及更高版本的代码
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};

9. 整数除法函数 intdiv()

10. session_start() 可以接受一个array 作为参数,用来覆盖php.ini 文件中设置的 会话配置选项。

11. preg_replace_callback_array()

在 PHP 7 之前,当使用 preg_replace_callback() 函数的时候, 由于针对每个正则表达式都要执行回调函数,可能导致过多的分支代码。 而使用新加的 preg_replace_callback_array() 函数, 可以使得代码更加简洁

现在,可以使用一个关联数组来对每个正则表达式注册回调函数, 正则表达式本身作为关联数组的键, 而对应的回调函数就是关联数组的值。

12. 新加入两个跨平台的函数: random_bytes() 和 random_int() 用来产生高安全级别的随机字符串和随机整数。

13. 可以使用list() 函数来展开实现了ArrayAccess接口的对象。

7.0.x  至7.1.x

新特性:

1. 可为空(Nullable) 类型

参数以及返回值的类型现在可以通过在类型前加一个问号 ? 使之允许为空。当启用这个特性时,传入的参数或者 函数返回的结果 要么是给定的类型,要么是 null

//    function testReturn(): ?string
//    {
//        return 'elePHPant';
//    }
//
//    var_dump(testReturn());  //string(9) "elePHPant"

    function testReturn(): ?string
    {
        return null;
    }

    var_dump(testReturn());     //NULL

    function test(?string $name)
    {
        var_dump($name);
    }

    test('elePHPant');  //string(9) "elePHPant"
    test(null);         // NULL
    //test();

2. 返回void 函数

一个新的返回值类型void被引入。 返回值声明为 void 类型的方法要么干脆省去 return 语句,要么使用一个空的 return 语句。 对于 void 函数来说,NULL 不是一个合法的返回值。

    function swap(&$left, &$right) : void
    {
        if ($left === $right) {
            return;   //return null 会报错 error
        }

        $tmp = $left;
        $left = $right;
        $right = $tmp;
    }

    $a = 1;
    $b = 2;
    var_dump(swap($a, $b), $a, $b);

3. 现在支持设置 常量的可见性。

class ConstDemo
{
    const PUBLIC_CONST_A = 1;
    public const PUBLIC_CONST_B = 2;
    protected const PROTECTED_CONST = 3;
    private const PRIVATE_CONST = 4;
}

4. iterable 类型

现在引入了一个新的被称为iterable的伪类 (与callable类似)。 这可以被用在参数或者返回值类型中,它代表接受数组或者实现了Traversable接口的对象。 至于子类,当用作参数时,子类可以收紧父类的iterable类型到array 或一个实现了Traversable的对象。对于返回值,子类可以拓宽父类的 array或对象返回值类型到iterable

<?php
function iterator(iterable $iter)
{
    foreach ($iter as $val) {
        //
    }
}

5.  多异常捕获处理

一个catch语句块现在可以通过管道字符(|)来实现多个异常的捕获。 这对于需要同时处理来自不同类的不同异常时很有用。

<?php
try {
    // some code
} catch (FirstException | SecondException $e) {
    // handle first and second exceptions
}

6. list() 现在支持键名

现在list()和它的新的[]语法支持在它内部去指定键名。这意味着它可以将任意类型的数组 都赋值给一些变量(与短数组语法类似)

    $data = [
        ["id" => 1, "name" => 'Tom', 'xiao','er'],
        ["id" => 2, "name" => 'Fred'],
    ];

// list() style
    list("id" => $id1, "name" => $name1) = $data[0];
    list( "name" => $name1, "id" => $id1,) = $data[0];
    list( $name1,  $id1,) = $data[0];
    var_dump($name1);


// [] style
    ["id" => $id1, "name" => $name1] = $data[0];

// list() style
    foreach ($data as list("id" => $id, "name" => $name)) {
        // logic here with $id and $name
    }

// [] style
    foreach ($data as ["id" => $id, "name" => $name]) {
        // logic here with $id and $name
    }

7. 支持为负的字符串偏移量。

var_dump("abcdef"[-2]);
var_dump(strpos("aabbcc", "b", -3));

string(1) "e"
int(3)

8. Closure新增了一个静态方法,用于将callable快速地 转为一个Closure 对象。

    class Test
    {
        public function exposeFunction()
        {
            return Closure::fromCallable([$this, 'privateFunction']);
        }

        private function privateFunction($param)
        {
            var_dump($param);
        }
    }

    $privFunc = (new Test)->exposeFunction();
    $privFunc('some value');

新增的函数:

Session

session_create_id()

session_gc()

is_iterable()

不向后兼容:

当传递参数过少时将抛出错误。

在过去如果我们调用一个用户定义的函数时,提供的参数不足,那么将会产生一个警告(warning)。 现在,这个警告被提升为一个错误异常(Error exception)。这个变更仅对用户定义的函数生效, 并不包含内置函数。

析构方法在一个不完整的对象(例如在构造方法中抛出一个异常)上将不再会被调用。

Variables bound to a closure via the use construct cannot use the same name as any superglobals, $this, or any parameter. For example, all of these function definition will result in a fatal error:

<?php
$f = function () use ($_SERVER) {};
$f = function () use ($this) {};
$f = function ($param) use ($param) {};

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章