日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

令人期待的 PHP7.4

瀏覽:179日期:2022-09-11 13:50:24
PHP 7.4 有什么新功能?數(shù)組表達(dá)式中引入 Spread 運(yùn)算符箭頭函數(shù) 2.0 (簡短閉包)NULL 合并運(yùn)算符類型屬性 2.0弱引用協(xié)變返回和逆變參數(shù)預(yù)加載PHP7.4 又將廢棄什么功能呢?更改連接運(yùn)算符的優(yōu)先級棄用左關(guān)聯(lián)三元運(yùn)算符

PHP 7.4 是下一個(gè) PHP 7 的次要版本,預(yù)計(jì)將于 2019 年 11 月 28 日發(fā)布到 General Availability。讓我們來了解下 PHP 7.4 新增的功能,這些新功能將使 PHP 更快,更可靠。

當(dāng)然,更令我期待是 PHP 8。因?yàn)?JIT 的一些提議,已經(jīng)獲得批準(zhǔn),這可能成為 PHP 的又一個(gè)里程碑。

PHP 7.4 有什么新功能?#支持?jǐn)?shù)組內(nèi)解包 - 數(shù)組擴(kuò)展運(yùn)算符箭頭函數(shù) 2.0 (更加簡短的閉包)NULL 合并運(yùn)算符弱引用協(xié)變返回和逆變參數(shù)預(yù)加載數(shù)組表達(dá)式中引入 Spread 運(yùn)算符#

自 PHP 5.6 起可用,參數(shù)解包是將數(shù)組和 Traversable 解包為參數(shù)列表的語法。要解壓一個(gè)數(shù)組或 Traversable,必須以 ...(3 點(diǎn))為前綴,如下例所示:

function test(...$args) { var_dump($args); } test(1, 2, 3);

然而 PHP 7.4 RFC 建議將此功能擴(kuò)展到數(shù)組中去定義:

$arr = [...$args];

Spread 運(yùn)算符的第一個(gè)好處就是性能,RPC 文檔指出:

Spread 運(yùn)算符應(yīng)該比array_merge擁有更好的性能。這不僅僅是 Spread 運(yùn)算符是一個(gè)語法結(jié)構(gòu),而array_merge是一個(gè)方法。還是在編譯時(shí),優(yōu)化了高效率的常量數(shù)組

Spread 運(yùn)算符的一個(gè)顯著優(yōu)點(diǎn)是它支持任何可遍歷的對象,而該array_merge函數(shù)僅支持?jǐn)?shù)組。

以下是數(shù)組中參數(shù)帶有 Spread 運(yùn)算符的示例:

$parts = [’apple’, ’pear’]; $fruits = [’banana’, ’orange’, ...$parts, ’watermelon’]; var_dump($fruits);

如果在 PHP 7.3 或更早版本中運(yùn)行此代碼,PHP 會(huì)拋出一個(gè) Parse 錯(cuò)誤:

Parse error: syntax error, unexpected ’...’ (T_ELLIPSIS), expecting ’]’ in /app/spread-operator.php on line 3

相反,PHP 7.4 將返回一個(gè)數(shù)組

array(5) { [0]=> string(6) 'banana' [1]=> string(6) 'orange' [2]=> string(5) 'apple' [3]=> string(4) 'pear' [4]=> string(10) 'watermelon' }

RFC 聲明我們可以多次擴(kuò)展同一個(gè)數(shù)組。此外,我們可以在數(shù)組中的任何位置使用 Spread Operator 語法,因?yàn)榭梢栽?spread 運(yùn)算符之前或之后添加常規(guī)元素。因此,以下代碼將按預(yù)期工作:

$arr1 = [1, 2, 3]; $arr2 = [4, 5, 6]; $arr3 = [...$arr1, ...$arr2]; $arr4 = [...$arr1, ...$arr3, 7, 8, 9];

也可以將函數(shù)返回的數(shù)組作為參數(shù),放到新數(shù)組中:

function buildArray(){ return [’red’, ’green’, ’blue’]; } $arr1 = [...buildArray(), ’pink’, ’violet’, ’yellow’];

PHP 7.4 輸出以下數(shù)組:

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 會(huì)拋出以下 Parse 錯(cuò)誤:

Parse error: syntax error, unexpected ’&’ in /app/spread-operator.php on line 3

如果第一個(gè)數(shù)組的元素是通過引用存儲(chǔ)的,那么它們也通過引用存儲(chǔ)在第二個(gè)數(shù)組中。這是一個(gè)例子:

$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' }箭頭函數(shù) 2.0 (簡短閉包)#

在 PHP 中,匿名函數(shù)被認(rèn)為是非常冗長且難以實(shí)現(xiàn)和難以維護(hù)的,RFC 建議引入更簡單,更清晰的箭頭函數(shù)(或簡短閉包)語法,這樣我們就可以簡潔地編寫代碼。

在 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 允許使用更簡潔的語法,上面的函數(shù)可以重寫如下:

$a = [1, 2, 3, 4, 5]; $b = array_map(fn($n) => $n * $n * $n, $a); print_r($b);

目前,由于語言結(jié)構(gòu),匿名函數(shù)(閉包)可以使用use繼承父作用域中定義的變量,如下所示:

$factor = 10; $calc = function($num) use($factor){ return $num * $factor; };

但是在 PHP 7.4 中,父級作用域的值是通過隱式捕獲的(隱式按值的作用域進(jìn)行綁定)。所以我們可以用一行來完成一下這個(gè)函數(shù):

$factor = 10; $calc = fn($num) => $num * $factor;

父級作用域定義的變量可以用于箭頭函數(shù),它跟我們使用use是等價(jià)的,并且不可能被父級所修改。

新語法是對語言的一個(gè)很大改進(jìn),因?yàn)樗试S我們構(gòu)建更易讀和可維護(hù)的代碼。

NULL 合并運(yùn)算符#

由于日常使用中存在大量同時(shí)使用三元表達(dá)式和 isset () 的情況, 我們添加了 null 合并運(yùn)算符 (??) 這個(gè)語法糖。如果變量存在且值不為 NULL, 它就會(huì)返回自身的值,否則返回它的第二個(gè)操作數(shù)。

$username = $_GET[’user’] ?? ‘nobody’;

這段代碼的作用非常簡單:它獲取請求參數(shù)并設(shè)置默認(rèn)值(如果它不存在)。但是在 RFC 這個(gè)例子中,如果我們有更長的變量名稱呢?

$this->request->data[’comments’][’user_id’] = $this->request->data[’comments’][’user_id’] ?? ’value’;

長遠(yuǎn)來看,這段代碼可能難以維護(hù)。因此,旨在幫助開發(fā)人員編寫更直觀的代碼,這個(gè) RFC 建議引入 null 合并等于運(yùn)算符 (null_coalesce_equal_operator)??=,所以我們可以敲下面這段代碼來替代上面的這段代碼:

$this->request->data[’comments’][’user_id’] ??= ‘value’;

如果左側(cè)參數(shù)的值為null,則使用右側(cè)參數(shù)的值。

注意,雖然 coalesce 運(yùn)算符??是一個(gè)比較運(yùn)算符,但??=它是賦值運(yùn)算符。

類型屬性 2.0#

類型的聲明,類型提示,以及指定確定類型的變量傳遞給函數(shù)或類的方法。其中類型提示是在 PHP5 的時(shí)候有的一個(gè)功能,PHP 7.2 的時(shí)候添加了object的數(shù)據(jù)類型。而 PHP7.4 更是增加了主類屬性聲明,看下面的例子:

class User { public int $id; public string $name; }

除了void和callable外,所有的類型都支持:

public int $scalarType; protected ClassName $classType; private ?ClassName $nullableClassType;

為什么不支持void和callable?下面是 RFC 的解釋

Thevoidtype is not supported, because it is not useful and has unclear semantics.不支持void類型,是因?yàn)樗鼪]用,并且語義不清晰。

Thecallabletype is not supported, because its behavior is context dependent.不支持callable類型,因?yàn)槠湫袨槿Q于上下文。

因此,我們可以放心使用bool,int,float,string,array,object,iterable,self,parent,當(dāng)然還有我們很少使用的 nullable空允許 (?type)

所以你可以在 PHP7.4 中這樣敲代碼:

// 靜態(tài)屬性的類型 public static iterable $staticProp; // var 中聲明屬性 var bool $flagl // 設(shè)置默認(rèn)的值 // 注意,只有 nullable 的類型,才能設(shè)置默認(rèn)值為 null public string $str = 'foo'; public ?string $nullableStr = null; // 多個(gè)同類型變量的聲明 public float $x, $y;

如果我們傳遞不符合給定類型的變量,會(huì)發(fā)生什么?

class User { public int $id; public string $name; } $user = new User; $user->id = 10; $user->name = []; // 這個(gè)會(huì)產(chǎn)生一個(gè)致命的錯(cuò)誤 Fatal error: Uncaught TypeError: Typed property User::$name must be string, array used in /app/types.php:9弱引用#

在這個(gè) RFC 中,提議引入WeakReference這個(gè)類,弱引用允許編碼時(shí)保留對對象的引用,該引用不會(huì)阻止對象被破壞;這對于實(shí)現(xiàn)類似于緩存的結(jié)構(gòu)非常有用。

該提案的作者 Nikita Popov 給出的一個(gè)例子:

$object = new stdClass; $weakRef = WeakReference::create($object); var_dump($weakRef->get()); unset($object); var_dump($weakRef->get()); // 第一次 var_dump object(stdClass)#1 (0) {} // 第二次 var_dump,當(dāng) object 被銷毀的時(shí)候,并不會(huì)拋出致命錯(cuò)誤 NULL協(xié)變返回和逆變參數(shù)#

協(xié)變和逆變百度百科的解釋

Invariant (不變): 包好了所有需求類型Covariant (協(xié)變):類型從通用到具體

Contravariant (逆變): 類型從具體到通用

目前,PHP 主要具有Invariant的參數(shù)類型,并且大多數(shù)是Invariant的返回類型,這就意味著當(dāng)我是 T 參數(shù)類型或者返回類型時(shí),子類也必須是 T 的參數(shù)類型或者返回類型。但是往往會(huì)需要處理一些特殊情況,比如具體的返回類型,或者通用的輸入類型。

而 RFC 的這個(gè)提案就提議,PHP7.4 添加協(xié)變返回和逆變參數(shù),以下是提案給出來的例子:

協(xié)變返回:

interface Factory { function make(): object; } class UserFactory implements Factory { // 將比較泛的 object 類型,具體到 User 類型 function make(): User; }

逆變參數(shù):

interface Concatable { function concat(Iterator $input); } class Collection implements Concatable { // 將比較具體的 `Iterator`參數(shù)類型,逆變成接受所有的 `iterable`類型 function concat(iterable $input) {/* . . . */} }預(yù)加載#

這個(gè) RFC 是由 Dmitry Stogov 提出的,預(yù)加載是在模塊初始化的時(shí)候,將庫和框架加載到 OPCache 中的過程,如下圖所示

令人期待的 PHP7.4

引用他的原話:

On server startup – before any application code is run – we may load a certain set of PHP files into memory – and make their contents “permanently available” to all subsequent requests that will be served by that server. All the functions and classes defined in these files will be available to requests out of the box, exactly like internal entities.

服務(wù)器啟動(dòng)時(shí) - 在運(yùn)行任何應(yīng)用程序代碼之前 - 我們可以將一組 PHP 文件加載到內(nèi)存中 - 并使得這些預(yù)加載的內(nèi)容,在后續(xù)的所有請求中 “永久可用”。這些文件中定義的所有函數(shù)和類在請求時(shí),就可以開箱即用,與內(nèi)置函數(shù)相同。

預(yù)加載由php.ini的opcache.preload進(jìn)行控制。這個(gè)參數(shù)指定在服務(wù)器啟動(dòng)時(shí)編譯和執(zhí)行的 PHP 腳本。此文件可用于預(yù)加載其他文件,或通過 opcache_compile_file()函數(shù)

這在性能上有很大的提升,但是也有一個(gè)很明顯的缺點(diǎn),RFC 提出來了

preloaded files remain cached in opcache memory forever. Modification of their corresponding source files won’t have any effect without another server restart.

預(yù)加載的文件會(huì)被永久緩存在 opcache 內(nèi)存中。在修改相應(yīng)的源文件時(shí),如果沒有重啟服務(wù),修改就不會(huì)生效。

PHP7.4 又將廢棄什么功能呢?#更改連接運(yùn)算符的優(yōu)先級更改連接運(yùn)算符的優(yōu)先級#

目前,在 PHP 中+,-算術(shù)運(yùn)算符和.字符串運(yùn)算符是左關(guān)聯(lián)的, 而且它們具有相同的優(yōu)先級。例如:

echo 'sum: ' . $a + $b;

在 PHP 7.3 中,此代碼生成以下警告:

Warning: A non-numeric value encountered in /app/types.php on line 4

這是因?yàn)檫@段代碼是從左往右開始的,所以等同于:

echo ('$sum: ' . $a) + $b;

針對這個(gè)問題,這個(gè) RFC 建議更改運(yùn)算符的優(yōu)先級,使.的優(yōu)先級低于+,-這兩個(gè)運(yùn)算符,以便在字符串拼接之前始終執(zhí)行加減法。所以這行代碼應(yīng)該等同于以下內(nèi)容:

echo '$sum: ' . ($a + $b);

這個(gè)提案分為兩步走:

從 PHP7.4 開始,當(dāng)遇見+-和.在沒有指明執(zhí)行優(yōu)先級時(shí),會(huì)發(fā)出一個(gè)棄用通知。

而真正調(diào)整優(yōu)先級的這個(gè)功能,會(huì)在 PHP8 中執(zhí)行

棄用左關(guān)聯(lián)三元運(yùn)算符#

在 PHP 中,三元運(yùn)算符與許多其他語言不同,它是左關(guān)聯(lián)的。而根據(jù) Nikita Popof 的所說:對于在不同語言之間切換的編程人員來說,會(huì)令他們感到困擾。

比如以下的例子,在 PHP 中是正確的:

$b = $a == 1 ? ’one’ : $a == 2 ? ’two’ : $a == 3 ? ’three’ : ’other’;

它會(huì)被解釋為:

$b = (($a == 1 ? ’one’ : $a == 2) ? ’two’ : $a == 3) ? ’three’ : ’other’;

對于這種復(fù)雜的三元表現(xiàn)形式,它很有可能不是我們希望的方式去工作,容易造成錯(cuò)誤。因此,這個(gè) RFC 提議刪除并棄用三元運(yùn)算符的左關(guān)聯(lián)使用,強(qiáng)制編程人員使用括號(hào)。

這個(gè)提議分為兩步執(zhí)行:

從 PHP7.4 開始,沒有明確使用括號(hào)的嵌套三元組將拋出棄用警告。從 PHP 8.0 開始,將出現(xiàn)編譯運(yùn)行時(shí)錯(cuò)誤。
標(biāo)簽: PHP
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美亚洲人成在线| 91精品在线免费视频| 91看片一区| 蜜桃国内精品久久久久软件9| 蜜臀精品久久久久久蜜臀| 国产精品男女| 中文精品视频| 精品视频国产| 中文字幕av一区二区三区人| 国产高潮在线| **爰片久久毛片| 国产一区亚洲| 国产专区精品| 日本不卡一区二区三区| 成人欧美一区二区三区的电影| 免费成人在线视频观看| 97精品在线| 国产欧美久久一区二区三区| 久久久影院免费| 精品一区视频| 亚洲精品动态| 欧美 日韩 国产一区二区在线视频| 国产日韩欧美一区在线| 午夜亚洲精品| 日韩三区在线| 国产伦理久久久久久妇女| 羞羞答答国产精品www一本| 国产精品99久久精品| 国产调教精品| 亚洲精品免费观看| 西西人体一区二区| 久久精品卡一| 欧美久久天堂| 欧美xxxx性| 国产欧美二区| 日韩精品成人| 蜜臀精品一区二区三区在线观看 | 久久一区二区三区喷水| 欧美精品aa| 日韩动漫一区| 亚洲视频国产精品| 亚洲国产综合在线看不卡| 成人亚洲一区| 久久精品女人| 精品国产三区在线| 美女av一区| 欧美激情麻豆| 麻豆一区在线| 国产精品www994| 日韩不卡一区二区三区| 中文字幕成人| 日本久久一区| 日韩精品中文字幕吗一区二区| 中文不卡在线| 中文字幕日韩欧美精品高清在线| 亚洲综合日本| 中文无码日韩欧| 日韩专区视频网站| 日韩激情一区二区| 国产亚洲久久| 美女精品久久| 中文字幕在线高清| 中文在线资源| 人人精品亚洲| 999国产精品永久免费视频app| 久久久一本精品| 激情综合自拍| 蜜臀av性久久久久蜜臀aⅴ四虎| 一区二区三区四区精品视频| 蜜臀av国产精品久久久久| 日本久久二区| 久久久91麻豆精品国产一区| 91亚洲国产| 欧美特黄一区| 日韩中文字幕一区二区高清99| 日本电影久久久| 国产精品亚洲一区二区在线观看| 国产精品欧美在线观看| 国产精品国产一区| 欧美中文字幕一区二区| 久久午夜影视| 欧美另类中文字幕| 久久男人av资源站| 久热精品在线| 国产九一精品| 久久精品观看| 日本不卡一二三区黄网| 九九九精品视频| 欧美日韩国产传媒| 日韩av电影一区| 亚洲啊v在线| 国产亚洲一级| 你懂的亚洲视频| 亚洲h色精品| 日韩av一级片| 欧美日韩尤物久久| 一区二区91| 国产aⅴ精品一区二区三区久久| 性欧美xxxx免费岛国不卡电影| 亚洲一区二区三区中文字幕在线观看| 国产欧美成人| 免费精品国产| 国产精品超碰| 中文欧美日韩| 国内一区二区三区| 在线精品亚洲| 麻豆mv在线观看| 日韩在线卡一卡二| 国产96在线亚洲| 日韩中文字幕一区二区三区| 精品99在线| 亚洲精品乱码久久久久久蜜桃麻豆| 久久精品国产一区二区| 日韩影院精彩在线| 国产成人精品亚洲线观看| 一区二区精彩视频| 色吊丝一区二区| 欧美日韩99| 五月天久久网站| 久久精品亚洲一区二区| 热久久国产精品| 亚洲精品88| 国产精品资源| 亚洲一级淫片| 国内精品福利| 老牛国内精品亚洲成av人片 | 视频一区二区三区入口| 色综合五月天| 日本午夜精品久久久久| re久久精品视频| 精品国内亚洲2022精品成人| 视频一区二区三区入口| 99久久婷婷| 精品国产乱码久久久久久1区2匹| 亚洲三级观看| 亚洲国产一区二区三区在线播放| 色欧美自拍视频| 国产欧美日韩一区二区三区在线| 免费日韩一区二区| 亚洲女同一区| 成人羞羞在线观看网站| 国产精品二区影院| 亚洲精品看片| 免费在线观看精品| 狠狠干综合网| 宅男在线一区| 亚洲国产影院| 日韩精品影视| av资源新版天堂在线| 麻豆国产一区| 蜜桃久久久久| 国产精品一区二区三区美女| 亚洲专区视频| 综合亚洲自拍| 水蜜桃久久夜色精品一区的特点| 另类中文字幕国产精品| 最近高清中文在线字幕在线观看1| 欧美精品97| 欧美激情视频一区二区三区在线播放| 日韩超碰人人爽人人做人人添| 亚洲精品精选| 天堂成人国产精品一区| 久久亚洲电影| 免费看日韩精品| 伊人久久一区| 中文字幕成人| 欧美日韩亚洲一区在线观看| 日韩高清在线观看一区二区| 日韩av中文字幕一区| 国产亚洲字幕| 国产精品久久久久久久久久妞妞| 久久精品凹凸全集| 欧美激情 亚洲a∨综合| 另类小说一区二区三区| 久久影院资源站| 国内一区二区三区| 亚洲不卡系列| 好看的av在线不卡观看| 久久午夜视频| 亚欧洲精品视频在线观看| 日韩欧美2区| 国产情侣久久| 国产精品久久久久蜜臀 | 日本а中文在线天堂| 亚洲va中文在线播放免费| 国产精品7m凸凹视频分类| 久久成人国产| 清纯唯美亚洲综合一区| 久久久久久亚洲精品美女| 国产夫妻在线| 宅男在线一区| 日韩精品a在线观看91| 国产经典一区| 久久久久久免费视频| 欧美专区一区二区三区| 国产亚洲一区二区三区啪| 日本久久综合| 亚洲自拍另类| 国产美女撒尿一区二区| 中文字幕在线视频网站|