成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

你知道PHP 7.4的新增特性有哪些?

在PHP中有太多我們需要學習和了解的東西,今天這篇文章就讓我們一起去看看php7.4中的秘密吧!我相信,當你們看完這篇文章后一定會收獲很多東西,話不多說,一起看看吧!

你知道PHP 7.4的新增特性有哪些?

PHP 7.4中的PHP有何新功能?

在本文中,我們討論了PHP 7.4最終版本中應在語言中添加的一些更改和功能:

  • 支持數組內解包 – 數組擴展Spread運算符
  • 箭頭函數 2.0 (更加簡短的閉包)
  • NULL 合并運算符
  • 弱引用
  • 協變返回和逆變參數
  • 預加載
  • 新的自定義對象序列化機制

性能提升,數組表達式中引入 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 運算符 ?? 是一個比較運算符,但 ??= 它是賦值運算符。

類型屬性 2.0

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

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

除了 voidcallable 外,所有的類型都支持

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

為什么不支持 voidcallable?下面是 RFC 的解釋

The void type is not supported, because it is not useful and has unclear semantics.
不支持 void 類型,是因為它沒用,并且語義不清晰。

The callable type is not supported, because its behavior is context dependent.
不支持 callable 類型,因為其行為取決于上下文。

因此,我們可以放心使用 boolintfloatstringarrayobjectiterableselfparent,當然還有我們很少使用的 nullable 空允許 (?type)

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

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

如果我們傳遞不符合給定類型的變量,會發生什么?

  class User {     public int $id;     public string $name;   }    $user = new User;   $user->id = 10;   $user->name = [];    // 這個會產生一個致命的錯誤   Fatal error: Uncaught TypeError: Typed property User::$name must be string, array used in /app/types.php:9

弱引用

在這個 RFC 中,提議引入 WeakReference 這個類,弱引用允許編碼時保留對對象的引用,該引用不會阻止對象被破壞;這對于實現類似于緩存的結構非常有用。

該提案的作者 Nikita Popov 給出的一個例子:

  $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,當 object 被銷毀的時候,并不會拋出致命錯誤   NULL

協變返回和逆變參數

協變和逆變
百度百科的解釋

  • Invariant (不變): 包好了所有需求類型
  • Covariant (協變):類型從通用到具體
  • Contravariant (逆變): 類型從具體到通用目前,PHP 主要具有 Invariant 的參數類型,并且大多數是 Invariant 的返回類型,這就意味著當我是 T 參數類型或者返回類型時,子類也必須是 T 的參數類型或者返回類型。但是往往會需要處理一些特殊情況,比如具體的返回類型,或者通用的輸入類型。而 RFC 的這個提案就提議,PHP7.4 添加協變返回和逆變參數,以下是提案給出來的例子:協變返回:
interface Factory {   function make(): object; }  class UserFactory implements Factory {   // 將比較泛的 object 類型,具體到 User 類型  function make(): User; }

逆變參數:

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

預加載

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

你知道PHP 7.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.
服務器啟動時 – 在運行任何應用程序代碼之前 – 我們可以將一組 PHP 文件加載到內存中 – 并使得這些預加載的內容,在后續的所有請求中 “永久可用”。這些文件中定義的所有函數和類在請求時,就可以開箱即用,與內置函數相同。

預加載由 php.iniopcache.preload 進行控制。這個參數指定在服務器啟動時編譯和執行的 PHP 腳本。此文件可用于預加載其他文件,或通過 opcache_compile_file() 函數

這在性能上有很大的提升,但是也有一個很明顯的缺點,RFC 提出來了

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

預加載的文件會被永久緩存在 opcache 內存中。在修改相應的源文件時,如果沒有重啟服務,修改就不會生效。

新的自定義對象序列化機制

這是尼基塔·波波夫(Nikita Popov)的另一項建議 ,得到了絕大多數票的批準。

當前,我們有兩種不同的機制可以在PHP中對對象進行自定義序列化:

  • __sleep()__wakeup()魔術方法
  • Serializable接口

根據Nikita的說法,這兩個選項都存在導致復雜且不可靠的代碼的問題。 您可以在RFC中深入研究此主題。 在這里,我只提到新的序列化機制應該通過提供兩個結合了兩個現有機制的新魔術方法__serialize()__unserialize()來防止這些問題。

該提案以20票對7票獲得通過。

PHP7.4 又將廢棄什么功能呢?

更改連接運算符的優先級

目前,在 PHP 中 + , - 算術運算符和 . 字符串運算符是左關聯的, 而且它們具有相同的優先級。例如:

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

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

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

這是因為這段代碼是從左往右開始的,所以等同于:

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

針對這個問題,這個 RFC 建議更改運算符的優先級,使 . 的優先級低于 +- 這兩個運算符,以便在字符串拼接之前始終執行加減法。所以這行代碼應該等同于以下內容:

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

這個提案分為兩步走:

  • 從 PHP7.4 開始,當遇見 + -. 在沒有指明執行優先級時,會發出一個棄用通知。
  • 而真正調整優先級的這個功能,會在 PHP8 中執行棄用左關聯三元運算符在 PHP 中,三元運算符與許多其他語言不同,它是左關聯的。而根據 Nikita Popof 的所說:對于在不同語言之間切換的編程人員來說,會令他們感到困擾。比如以下的例子,在 PHP 中是正確的:$b = $a == 1 ? 'one' : $a == 2 ? 'two' : $a == 3 ? 'three' : 'other';它會被解釋為:$b = (($a == 1 ? 'one' : $a == 2) ? 'two' : $a == 3) ? 'three' : 'other';對于這種復雜的三元表現形式,它很有可能不是我們希望的方式去工作,容易造成錯誤。因此,這個 RFC 提議刪除并棄用三元運算符的左關聯使用,強制編程人員使用括號。這個提議分為兩步執行:
  • 從 PHP7.4 開始,沒有明確使用括號的嵌套三元組將拋出棄用警告。
  • 從 PHP 8.0 開始,將出現編譯運行時錯誤。

php7.4性能

出于對PHP 7.4的Alpha預覽版性能狀態的好奇,我今天針對使用Git構建的PHP 7.3.6、7.2.18、7.1.29和7.0.32運行了一些快速基準測試,并且每個發行版均以相同的方式構建。

你知道PHP 7.4的新增特性有哪些?

在此階段,PHPBench的7.4性能與PHP 7.3穩定版相當,已經比PHP 7.0快了約30%…當然,與PHP 5.5的舊時代相比,收益甚至更大。

你知道PHP 7.4的新增特性有哪些?

在微基準測試中,PHP 7.4的運行速度僅比PHP 7.3快一點,而PHP-8.0的性能卻差不多,至少要等到JIT代碼穩定下來并默認打開為止。

你知道PHP 7.4的新增特性有哪些?

在Phoronix測試套件的內部PHP自基準測試中,PHP 7.4的確確實處于PHP 7.3性能水平之上-至少在此Alpha前狀態下。 自PHP 7.0起,取得了一些顯著的進步,而自PHP5發行緩慢以來,也取得了許多進步。

總結:PHP7.4是一個令人期待的版本,但是PHP8才是整個PHP界最重大的事情。

推薦學習:《PHP視頻教程》

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
免费人成年激情视频在线观看 | 天天摸天天摸色综合舒服网| 熟女精品视频一区二区三区 | 亚洲日韩国产一区二区三区在线| 夜夜躁狠狠躁日日躁2022| 在线看片无码永久免费视频| 99久久精品国产第一页| Xx性欧美肥妇精品久久久久久久久| 成年女美黄网站大全免费播放 | 久久人妻少妇嫩草AV蜜桃| 奶头大他一口都含不住| 日本丰满熟妇人妻aqq| 无码日韩精品一区二区人妻 | 精品国产_亚洲人成在线| 久久天天躁夜夜躁狠狠躁| 欧美人与禽XOXO牲伦交| 熟妇高潮一区二区精品| 亚洲国产精品悠悠久久琪琪| 中文字幕乱偷无码AV先锋蜜桃| 波多野结衣无码中文字幕18禁| 国产精品毛片无遮挡| 精品无码国产污污污免费网站国产 | 精华液一区二区区别| 蜜乳AV一区二区三区四区| 日韩中文字幕中文无码久本草| 无码内射中文字幕岛国片| 一二三四视频中文字幕| 成年网站未满十八禁在线观看| 国产无遮挡又黄又爽又色| 蜜桃国产精品乱码一区二区三区 | 成人亚洲AV网站在线看AAAA| 国产做出在线 | 传媒麻豆| 免费国内接码在线接收| 四川少妇BBW搡BBBB槡BBBB| 亚洲欧美日韩国产精品一区| WWW射我里面在线观看| 国产在线拍揄自揄拍免费下载| 免费人成激情视频在线观看冫| 他的白月光H1∨1笔趣阁| 亚洲综合伊人久久综合| 纯肉无遮挡H肉动漫在线观看网址| 国产在线乱码一区二区三区| 女子初尝黑人巨嗷嗷叫| 吸咬奶头狂揉60分钟视频| 18禁黄网站禁片免费观看在线| 国产传媒中文字幕视频专区| 乱肉怀孕又粗又大| 污污网站18禁在线永久免费观看 | 亚洲高清国产拍精品动图| 啊~每一次都撞到最里面| 黑人巨大BBWBBW| 人人妻人人爽日日人人| 亚洲精品TV久久久久久久久久| 锕锕锕锕锕锕锕好疼JK| 精品少妇人妻Av免费久久农村| 日本少妇人妻ⅩⅩXXX厨房| 亚洲色成人网一二三区| 国产69精品久久久久777| 麻花豆传媒剧国产MV在线下载| 无码国产精品一区二区免费久久 | 激情综合丁香五月| 日韩激情在线小视频观看| 伊人久久综合无码成人网| 国产精品原创AV片国产日韩| 欧美人禽猛交乱配视频网站| 亚洲精品无码久久久久APP| 丰满熟女一区二区三区蜜桃臀| 乱人伦中文无码视频| 亚洲AV成人无码一区二区三区在| 锕锕锕锕锕锕好痛WWW在线观看 | 日本老熟妇乱子伦精品| 一区二区三区无码免费看| 国产精品国产三级国产AN| 欧美丰满多毛少妇XXXXX性| 亚洲国产欧美在线综合| 国产成人丝袜视频在线观看| 欧美视频在线观看一区二区三区| 亚洲国产精品久久精品| 国产成人牲交在线观看视频| 欧美最猛性XXXXX大叫| 伊人久久大香线焦AV色 | 女人与牛ZOZO| 亚洲一卡2卡3卡4卡5卡6卡| 国产精品天干天干在线观看澳门| 人妻丰满熟妇av无码区HD| 在线观看AV无需播放器| 精品国产V无码大片在线观看| 无码AV大香线蕉| 成人乱子视频在线播放| 欧美变态口味重另类在线视频| 亚洲午夜精品久久久久久浪潮| 国产丝袜无码一区二区三区视频| 少妇极品熟妇人妻无码| 八区精品色欲人妻综合网| 男女无遮挡高清视频免费看| 亚洲午夜性春猛交XXXX偷窥| 国语自产少妇精品视频蜜桃| 无码高潮少妇毛多水多水免费 | 少妇高潮太爽了在线播放| ZOOM与人性ZOOM1区别| 免费人成视网站在线不卡| 一二三四日本高清社区5| 精品国产一区二区三区吸毒 | 无码国产欧美日韩精品| 豆国产93在线 | 亚洲| 琪琪午夜伦埋影院77| 91人人澡人人爽内射电影院| 麻豆星空传媒果冻传媒大象 | 久久久久亚洲AV无码专区首 | 久久久久久久精品国产亚洲87| 亚洲成A人片在线播放| 国产免费无码一区二区视频| 无码AV天堂一区二区三区| 国产98色在线 | 日韩| 色欲AV蜜臀AV在线观看麻豆| 成人毛片无码一区二区三区| 日本久久久久精品免费网播放| YSL千人千色8610| 人妻AV一区二区三区精品| JIZZJIZZ中国护士高清多| 欧美成人天天综合在线| 99久久国产综合精品成人影院| 欧美成人AⅤ高清免费观看| 99精品国产兔费观看久久| 欧美丰满熟妇XX猛交| CHINA熟妇老熟女HD| 欧美性爱乱伦视频| YSL小金管水蜜桃色| 日本午夜免费福利视频| 成人午夜又粗又硬又长| 熟妇的荡欲BD高清| 国产精品普通话国语对白露脸| 午夜理论片YY6080影院| 国产亚州精品女人久久久久久| 亚洲AV永久无码精品一区二区国| 护士趴下光屁股翘臀被打的作文| 亚洲狠狠婷婷综合久久蜜芽 | 中文无码久久精品| 欧美VA久久久噜噜噜久久| AV无码国产在线看免费网站| 人妻在线日韩免费视频| 丰满熟妇乱子又伦| 性色AV无码专区亚洲AV毛片子| 和岳每晚弄的高潮嗷嗷叫| 亚洲熟妇V一区二区三区色堂| 久久亚洲SM情趣捆绑调教| 14表妺好紧没带套18分钟| 欧美综合自拍亚洲综合图片区 | 97精品国产手机| 日本乱熟人妻精品中文字幕| 丰满妇女强高潮18ⅩXXX| 无码被窝影院午夜看片爽爽JK| 国产亚洲AV片在线观看播放| 亚洲日本一线产区和二线产| 蜜臀av无码少妇一区二区三区| Y1111111少妇影院无码| 特级毛片内射WWW无码| 狠狠做深爱婷婷久久综合一区| 一本久久综合亚洲鲁鲁五月天| 欧美成人精品在线| 高清国语自产拍免费视频| 亚洲AV无码专区在线观看下载 | 99在线国内在线视频22| 三个女儿一锅烩大团圆全文阅读| 国产乱人伦偷精精品视频 | 国产成人无码AV在线播放不卡| 亚洲AV中文乱码一区二| 狂野欧美性猛XXXX乱大交| 锕锕锕锕锕锕好大好深APP| 无码人妻丰满熟妇片毛片| 精品欧美H无遮挡在线看中文| 91人人妻人人澡人人爽精品| 色欲久久久天天天综合网精品| 国产又大又粗又黄又爽白丝| 在线观看大片免费播放器| 日本少妇人妻XXXXⅩ18| 国产在线观看精品一区二区三区| 曰韩少妇内射免费播放 | 免费又大粗又爽又黄少妇毛片| 大桥未久亚洲无AV码在线| 亚洲精品AⅤ无码精品| 欧美精品色婷婷五月综合| 国产精品国产三级国产AV剧情| 一边亲着一面膜下奶韩剧| 日韩欧美一区二区三区免费观看| 国内精品久久久久精免费| 77777_亚洲午夜久久多人| 无码热综合无码色综合| 久久综合亚洲鲁鲁五月天| 粉嫩av观看成人网站| 亚洲熟妇色ⅩXXXX日本| 人妻无码人妻有码中文字幕在线 | 中文字幕精品一区二区精品| 少妇人妻无码永久免费视频| 久久久久久久97| 嗯~别停~用力点~再快点| 亚洲熟妇少妇任你躁在线观看无码 | 雨后小故事完整版| 婷婷97狠狠色综合| 免费无码又黄又爽又刺激 |