首頁> 頭條> 主體

令人期待的PHP7.4

藏色散人
發布: 2019-09-30 18:07:21
轉載
10513 人瀏覽過

令人期待的PHP7.4

PHP 7.4 是下一個 PHP 7 的次要版本,預計將於 2019 年 11 月 28 日發佈到 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 是一個方法。還是在編譯時,優化了高效率的常數數組

Spread 運算子的一個顯著優點是它支援任何可遍歷的對象,而該 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 運算子之前或之後新增常規元素。因此,以下程式碼將按預期工作:

$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';
登入後複製

长远来看,这段代码可能难以维护。因此,旨在帮助开发人员编写更直观的代码,这个 RFC建议引入 null 合并等于运算符 (null_coalesce_equal_operator)??=,所以我们可以敲下面这段代码来替代上面的这段代码:

$this->request->data['comments']['user_id'] ??= ‘value’;
登入後複製

如果左侧参数的值为 null,则使用右侧参数的值。

注意,虽然 coalesce 运算符 ?? 是一个比较运算符,但 ??= 它是赋值运算符。

相關標籤:
來源:learnku.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!