一、前言
php7目前(截止2018-09-17),最新的穩定版本是7.2.10(http://php.net/downloads.php上可查看版本信息),目前還有不少項目是用5.6甚至更早的版本。相比於php5.x的版本,php7有不少新的改進,性能方面也是有不少提升。下面來詳細講下。
二、新特性
1、php7.0相比於php5.6的新特性
參考:http://php.net/manual/zh/migration70.new-features.php 下面所講的內容都是來自於這篇文章,只是詳細地解釋。
1.1 標量類型聲明
函數/方法中的參數,是可以加一個類型聲明的,這個是php5.0就開始支持的,比如:
function testClass(類名 $c)
{
}
function testArray(array $a)
{
}
php5.x支持的這個類型不多,php7增加了幾個:
參考:http://php.net/manual/zh/functions.arguments.php#functions.arguments.type-declaration
這里的意思是,方法的參數的類型,只支持上面列出的這些類型,如果是其他類型,php5報錯致命錯誤,php7會報錯TypeError的異常。
舉個例子:
function test (boolean $b)
{
}
test(true);
執行結果:
Fatal error: Uncaught TypeError: Argument 1 passed to test() must be an instance of boolean, boolean given, called in - on line 1 and defined in -:1
這里報錯的原因是參數類型boolean不是一個合法的類型,上面截圖中可以看到是bool才對,不能用boolean。這里有點不好理解,就是我們大多會認為boolean就是bool,所以這里應該是規定好的,就是只能用bool,不能用boolean。
同理,用integer也是錯的,要用int。 float是包含了float和double的,如果用double也是會報錯的。再解釋下,用boolean的時候,因為不是bool,也不是int、float、self、array等,所以這個boolean會被認為是class或者interface,
報錯信息里面展示的是參數必須是boolean(類或接口)的一個實例,但是調用時傳入的參數是boolean類型(true的類型)。有點繞,但是應該不難理解。
1.2 返回值類型聲明
返回值的類型,跟參數的類型一致。
【注意】在默認情況下,函數返回值如果和定義的不一致,會進行強制轉換,在嚴格模式下,則會報錯TypeError。
這個例子這里是強制轉換了類型。
函數返回值的說明參考:http://php.net/manual/zh/functions.returning-values.php#functions.returning-values.type-declaration
1.3 null合並運算符
1.4 太空船操作符(暫時不清楚這個操作符有什么實際用處,后續了解清楚再補充上)
1.5 define允許定義常量數組
我們來看下define的聲明,參考:http://php.net/manual/zh/function.define.php
這個新特性大概是為了豐富define的功能,const已經實現了這個功能了的。
1.6 匿名類
詳細的匿名類參考:http://php.net/manual/zh/language.oop5.anonymous.php
【備注】考慮到篇幅問題,先跳過中間幾個個人覺得不太常用的特性
1.7 use分組命名空間
這里可以用一行代碼引入同一個命名空間下的多個類,而不是之前那樣需要每個類一行代碼,算是一種優化。
1.8 新增整數整除的函數intdiv()
返回值為整型。
參考:http://php.net/manual/zh/function.intdiv.php
1.9 新增的隨機函數
參考:
http://php.net/manual/zh/function.random-bytes.php
http://php.net/manual/zh/function.random-int.php
2、php7.1相對於php7.0的新特性
參考:http://php.net/manual/zh/migration71.new-features.php
涉及的內容不多,直接看上面的url即可。
3、php7.2相對於php7.1的新特性
參考:http://php.net/manual/zh/migration72.new-features.php
涉及的內容不多,直接看上面的url即可。