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