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) {};

 

 

 

 

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