PHP 7.4 是下一個 PHP 7 的次要版本完沪,預計將于 2019 年 11 月 28 日發(fā)布到 General Availability烤咧。讓我們來了解下 PHP 7.4 新增的功能沽一,這將使 PHP 更快,更可靠。
當然,更令我期待是 PHP 8汰聋。因為 JIT 的一些提議,已經獲得批準藕畔,這可能成為 PHP 的又一個里程碑马僻。
使用 PHP 7.4 的 PHP 有什么新功能庄拇?
● 支持數組內解包 - 數組擴展運算符
● 箭頭函數 2.0 (更加簡短的閉包)
PHP 7.4 在數組表達式中引入 Spread 運算符
自 PHP 5.6 起可用注服,參數解包是將數組和 Traversable 解包為參數列表的語法。要解壓一個數組或 Traversable措近,必須以 ...(3 點)為前綴溶弟,如下例所示:
function test(...$args) { var_dump($args); }
test(1, 2, 3);
然而 PHP 7.4 RFC 建議將此功能擴展到數組中去定義:
$arr = [...$args];
Spread 運算符的第一個好處就是性能,RPC 文檔指出:
Spread 運算符應該比 array_merge 擁有更好的性能瞭郑。這不僅僅是 Spread 運算符是一個語法結構辜御,而 array_merge 是一個方法。還是在編譯時屈张,優(yōu)化了高效率的常量數組
Spread 運算符的一個顯著優(yōu)點是它支持任何可遍歷的對象擒权,而該 array_merge 函數僅支持數組。
以下是數組中參數帶有 Spread 運算符的示例:
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
var_dump($fruits);
如果在 PHP 7.3 或更早版本中運行此代碼阁谆,PHP 會拋出一個 Parse 錯誤:
Parse error: syntax error, unexpected '...' (T_ELLIPSIS), expecting ']' in /app/spread-operator.php on line 3
相反碳抄,PHP 7.4 將返回一個數組
array(5) {
[0]=>
string(6) "banana"
[1]=>
string(6) "orange"
[2]=>
string(5) "apple"
[3]=>
string(4) "pear"
[4]=>
string(10) "watermelon"
}
RFC 聲明我們可以多次擴展同一個數組。此外场绿,我們可以在數組中的任何位置使用 Spread Operator 語法剖效,因為可以在 spread 運算符之前或之后添加常規(guī)元素。因此,以下代碼將按預期工作:
$arr1 = [1, 2, 3];
$arr2 = [4, 5, 6];
$arr3 = [...$arr1, ...$arr2];
$arr4 = [...$arr1, ...$arr3, 7, 8, 9];
也可以將函數返回的數組作為參數璧尸,放到新數組中:
function buildArray(){
return ['red', 'green', 'blue'];
}
$arr1 = [...buildArray(), 'pink', 'violet', 'yellow'];
PHP 7.4 輸出以下數組:
array(6) {
[0]=>
string(3) "red"
[1]=>
string(5) "green"
[2]=>
string(4) "blue"
[3]=>
string(4) "pink"
[4]=>
string(6) "violet"
[5]=>
string(6) "yellow"
}
我們也可以使用生成器:
function generator() {
for ($i = 3; $i <= 5; $i++) {
yield $i;
}
}
$arr1 = [0, 1, 2, ...generator()];
但不允許通過引用傳遞的方式咒林。請考慮以下示例:
$arr1 = ['red', 'green', 'blue'];
$arr2 = [...&$arr1];
如果我們嘗試通過傳遞引用的方式,PHP 會拋出以下 Parse 錯誤:
Parse error: syntax error, unexpected '&' in /app/spread-operator.php on line 3
如果第一個數組的元素是通過引用存儲的爷光,那么它們也通過引用存儲在第二個數組中垫竞。這是一個例子:
$arr0 = 'red';
$arr1 = [&$arr0, 'green', 'blue'];
$arr2 = ['white', ...$arr1, 'black'];
這是我們用 PHP 7.4 獲得的:
array(5) {
[0]=>
string(5) "white"
[1]=>
&string(3) "red"
[2]=>
string(5) "green"
[3]=>
string(4) "blue"
[4]=>
string(5) "black"
}
箭頭函數 2.0 (簡短閉包)
在 PHP 中,匿名函數被認為是非常冗長且難以實現和難以維護的瞎颗,RFC 建議引入更簡單件甥,更清晰的箭頭函數(或簡短閉包)語法,這樣我們就可以簡潔地編寫代碼哼拔。
在 PHP 7.4 以前:
function cube($n){
return ($n * $n * $n);
}
$a = [1, 2, 3, 4, 5];
$b = array_map('cube', $a);
print_r($b);
PHP 7.4 允許使用更簡潔的語法引有,上面的函數可以重寫如下:
$a = [1, 2, 3, 4, 5];
$b = array_map(fn($n) => $n * $n * $n, $a);
print_r($b);
目前,由于語言結構倦逐,匿名函數(閉包)可以使用 use 繼承父作用域中定義的變量譬正,如下所示:
$factor = 10;
$calc = function($num) use($factor){
return $num * $factor;
};
但是在 PHP 7.4 中,父級作用域的值是通過隱式捕獲的(隱式按值的作用域進行綁定)檬姥。所以我們可以用一行來完成一下這個函數:
$factor = 10;
$calc = fn($num) => $num * $factor;
父級作用域定義的變量可以用于箭頭函數曾我,它跟我們使用 use 是等價的,并且不可能被父級所修改健民。
新語法是對語言的一個很大改進抒巢,因為它允許我們構建更易讀和可維護的代碼。
NULL 合并運算符
由于日常使用中存在大量同時使用三元表達式和 isset () 的情況秉犹, 我們添加了 null 合并運算符 (??) 這個語法糖蛉谜。如果變量存在且值不為 NULL, 它就會返回自身的值崇堵,否則返回它的第二個操作數型诚。
$username = $_GET['user'] ?? ‘nobody';
這段代碼的作用非常簡單:它獲取請求參數并設置默認值(如果它不存在)。但是在 RFC 這個例子中鸳劳,如果我們有更長的變量名稱呢狰贯?
$this->request->data['comments']['user_id'] = $this->request->data['comments']['user_id'] ?? 'value';
長遠來看,這段代碼可能難以維護赏廓。因此涵紊,旨在幫助開發(fā)人員編寫更直觀的代碼,這個 RFC 建議引入 null 合并等于運算符 (null_coalesce_equal_operator)??=幔摸,所以我們可以敲下面這段代碼來替代上面的這段代碼:
$this->request->data['comments']['user_id'] ??= ‘value’;
如果左側參數的值為 null摸柄,則使用右側參數的值。
注意抚太,雖然 coalesce 運算符 ?? 是一個比較運算符塘幅,但 ??= 它是賦值運算符昔案。
本文參考地址:[https://www.php.cn/toutiao-429530.html](https://www.php.cn/toutiao-429530.html