令人期待的PHP7.4

image

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

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市电媳,隨后出現的幾起案子踏揣,更是在濱河造成了極大的恐慌,老刑警劉巖匾乓,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捞稿,死亡現場離奇詭異,居然都是意外死亡拼缝,警方通過查閱死者的電腦和手機娱局,發(fā)現死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咧七,“玉大人衰齐,你說我怎么就攤上這事〖套瑁” “怎么了耻涛?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瘟檩。 經常有香客問我抹缕,道長,這世上最難降的妖魔是什么墨辛? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任卓研,我火速辦了婚禮,結果婚禮上睹簇,老公的妹妹穿的比我還像新娘奏赘。我一直安慰自己,他們只是感情好带膀,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布志珍。 她就那樣靜靜地躺著橙垢,像睡著了一般垛叨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柜某,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天嗽元,我揣著相機與錄音,去河邊找鬼喂击。 笑死剂癌,一個胖子當著我的面吹牛,可吹牛的內容都是我干的翰绊。 我是一名探鬼主播佩谷,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼旁壮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谐檀?” 一聲冷哼從身側響起抡谐,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎桐猬,沒想到半個月后麦撵,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡溃肪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年免胃,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惫撰。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡羔沙,死狀恐怖,靈堂內的尸體忽然破棺而出厨钻,到底是詐尸還是另有隱情撬碟,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布莉撇,位于F島的核電站呢蛤,受9級特大地震影響,放射性物質發(fā)生泄漏棍郎。R本人自食惡果不足惜其障,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涂佃。 院中可真熱鬧励翼,春花似錦、人聲如沸辜荠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伯病。三九已至造烁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間午笛,已是汗流浹背惭蟋。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留药磺,地道東北人告组。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像癌佩,于是被迫代替她去往敵國和親木缝。 傳聞我的和親對象是個殘疾皇子便锨,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內容

  • 概要 64學時 3.5學分 章節(jié)安排 電子商務網站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,157評論 0 3
  • 函數和對象 1、函數 1.1 函數概述 函數對于任何一門語言來說都是核心的概念我碟。通過函數可以封裝任意多條語句鸿秆,而且...
    道無虛閱讀 4,550評論 0 5
  • 三,字符串擴展 3.1 Unicode表示法 ES6 做出了改進怎囚,只要將碼點放入大括號卿叽,就能正確解讀該字符。有了這...
    eastbaby閱讀 1,521評論 0 8
  • 一恳守、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 5,734評論 0 10
  • 函數參數的默認值 基本用法 在ES6之前考婴,不能直接為函數的參數指定默認值,只能采用變通的方法催烘。 上面代碼檢查函數l...
    呼呼哥閱讀 3,364評論 0 1