亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

PHP7新特性之抽象語法樹(AST)帶來的變化詳解

2024-05-05 00:04:39
字體:
來源:轉載
供稿:網友

本文分析了PHP7新特性之抽象語法樹(AST)帶來的變化。分享給大家供大家參考,具體如下:

這里大部分內容參照 AST 的 RFC 文檔而成:https://wiki.php.net/rfc/abstractsyntaxtree,為了易于理解從源文檔中節選部分進行介紹。

本文并不會告訴你抽象語法樹是什么,這需要你自己去了解,這里只是描述 AST 給 PHP 帶來的一些變化。

新的執行過程

PHP7 的內核中有一個重要的變化是加入了 AST。在 PHP5中,從 php 腳本到 opcodes 的執行的過程是:

  1. Lexing:詞法掃描分析,將源文件轉換成 token 流;
  2. Parsing:語法分析,在此階段生成 op arrays。

PHP7 中在語法分析階段不再直接生成 op arrays,而是先生成 AST,所以過程多了一步:

  1. Lexing:詞法掃描分析,將源文件轉換成 token 流;
  2. Parsing:語法分析,從 token 流生成抽象語法樹;
  3. Compilation:從抽象語法樹生成 op arrays。

執行時間和內存消耗

從以上的步驟來看,這比之前的過程還多了一步,所以按常理來說這反而會增加程序的執行時間和內存的使用。但事實上內存的使用確實增加了,但是執行時間上卻有所降低。

以下結果是使用?。ùa大約 100 行)、中(大約 700 行)、大(大約 2800 行)三個腳本分別進行測試得到的,測試腳本: https://gist.github.com/nikic/289b0c7538b46c2220bc.

每個文件編譯 100 次的執行時間(注意文章的測試結果時間是 14 年,PHP7 還叫 PHP-NG 的時候):

 

  php-ng php-ast diff
SMALL 0.180s 0.160s -12.5%
MEDIUM 1.492s 1.268s -17.7%
LARGE 6.703s 5.736s -16.9%

 

單次編譯中的內存峰值:

 

  php-ng php-ast diff
SMALL 378kB 414kB +9.5%
MEDIUM 507kB 643kB +26.8%
LARGE 1084kB 1857kB +71.3%

 

單次編譯的測試結果可能并不能代表實際使用的情況,以下是使用 PhpParser 進行完整項目測試得到的結果:

 

  php-ng php-ast diff
TIME 25.5ms 22.8ms -11.8%
MEMORY 2360kB 2482kB +5.1%

 

測試表明,使用 AST 之后程序的執行時間整體上大概有 10% 到 15% 的提升,但是內存消耗也有增加,在大文件單次編譯中增加明顯,但是在整個項目執行過程中并不是很嚴重的問題。

還有注意的是以上的結果都是在沒有 Opcache 的情況下,生產環境中打開 Opcache 的情況下,內存的消耗增加也不是很大的問題。

語義上的改變

如果僅僅是時間上的優化,似乎也不是使用 AST 的充足理由。其實實現 AST 并不是基于時間優化上的考慮,而是為了解決語法上的問題。下面來看一下語義上的一些變化。

yield 不需要括號

在 PHP5 的實現中,如果在一個表達式上下文(例如在一個賦值表達式的右側)中使用 yield,你必須在 yield申明兩邊使用括號:

<?php$result = yield fn(); // 不合法的$result = (yield fn()); // 合法的

這種行為僅僅是因為 PHP5 的實現方式的限制,在 PHP7 中,括號不再是必須的了。所以下面這些寫法也都是合法的:

<?php$result = yield;$result = yield $v;$result = yield $k => $v;

當然了,還得遵循 yield 的應用場景才行。

括號不影響行為

在 PHP5 中,($foo)['bar'] = 'baz' 和 $foo['bar'] = 'baz' 兩個語句的含義不一樣。事實上前一種寫法是不合法的,你會得到下面這樣的錯誤:

<?php($foo)['bar'] = 'baz';# PHP Parse error: Syntax error, unexpected '[' on line 1

但是在 PHP7 中,兩種寫法表示同樣的意思。

同樣,如果函數的參數被括號包裹,類型檢查存在問題,在 PHP7 中這個問題也得到了解決:

<?phpfunction func() { return [];}function byRef(array &$a) {}byRef((func()));

以上代碼在 PHP5 中不會告警,除非使用 byRef(func()) 的方式調用,但是在 PHP7 中,不管 func() 兩邊有沒有括號都會產生以下錯誤:

PHP Strict standards:  Only variables should be passed by reference ...

list() 的變化

list 關鍵字的行為改變了很多。list 給變量賦值的順序(等號左右同時的順序)以前是從右至左,現在是從左到右:

<?phplist($array[], $array[], $array[]) = [1, 2, 3];var_dump($array);// PHP5: $array = [3, 2, 1]// PHP7: $array = [1, 2, 3]# 注意這里的左右的順序指的是等號左右同時的順序,# list($a, $b) = [1, 2] 這種使用中 $a == 1, $b == 2 是沒有疑問的。

產生上面變化的原因正是因為在 PHP5 的賦值過程中,3 會最先被填入數組,1 最后,但是現在順序改變了。

同樣的變化還有:

<?php$a = [1, 2];list($a, $b) = $a;// PHP5: $a = 1, $b = 2// PHP7: $a = 1, $b = null + "Undefined index 1"

這是因為在以前的賦值過程中 $b 先得到 2,然后 $a 的值才變成 1,但是現在 $a 先變成了 1,不再是數組,所以 $b 就成了 null。

list 現在只會訪問每個偏移量一次:

<?phplist(list($a, $b)) = $array;// PHP5:$b = $array[0][1];$a = $array[0][0];// PHP7:// 會產生一個中間變量,得到 $array[0] 的值$_tmp = $array[0];$a = $_tmp[0];$b = $_tmp[1];

空的 list 成員現在是全部禁止的,以前只是在某些情況下:

<?phplist() = $a;   // 不合法list($b, list()) = $a; // 不合法foreach ($a as list()) // 不合法 (PHP5 中也不合法)

引用賦值的順序

引用賦值的順序在 PHP5 中是從右到左的,現在時從左到右:

<?php$obj = new stdClass;$obj->a = &$obj->b;$obj->b = 1;var_dump($obj);// PHP5:object(stdClass)#1 (2) { ["b"] => &int(1) ["a"] => &int(1)}// PHP7:object(stdClass)#1 (2) { ["a"] => &int(1) ["b"] => &int(1)}

__clone 方法可以直接調用

現在可以直接使用 $obj->__clone() 的寫法去調用 __clone 方法。__clone 是之前唯一一個被禁止直接調用的魔術方法,之前你會得到一個這樣的錯誤:

Fatal error: Cannot call __clone() method on objects - use 'clone $obj' instead in ...

變量語法一致性

AST 也解決了一些語法一致性的問題,這些問題是在另外一個 RFC 中被提出的:https://wiki.php.net/rfc/uniform_variable_syntax.

在新的實現上,以前的一些語法表達的含義和現在有些不同,具體的可以參照下面的表格:

 

Expression PHP5 PHP7
$$foo['bar']['baz'] ${$foo['bar']['baz']} ($$foo)['bar']['baz']
$foo->$bar['baz'] $foo->{$bar['baz']} ($foo->$bar)['baz']
$foo->$bar['baz']() $foo->{$bar['baz']}() ($foo->$bar)['baz']()
Foo::$bar['baz']() Foo::{$bar['baz']}() (Foo::$bar)['baz']()

 

整體上還是以前的順序是從右到左,現在從左到右,同時也遵循括號不影響行為的原則。這些復雜的變量寫法是在實際開發中需要注意的。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久手机精品视频| 深夜福利日韩在线看| 欧美一级成年大片在线观看| 欧美极品少妇与黑人| 久久精品国产久精国产一老狼| 国产乱肥老妇国产一区二| 精品无人国产偷自产在线| 欧美精品在线观看| 日本一区二三区好的精华液| 国产精品视频永久免费播放| 欧美超级乱淫片喷水| 久久这里只有精品视频首页| 亚洲人成网站色ww在线| 亚洲男人天堂九九视频| 国产精品美腿一区在线看| 韩国v欧美v日本v亚洲| 亚洲精品欧美日韩专区| 91av在线精品| 精品亚洲aⅴ在线观看| 国产精品劲爆视频| 国内精品在线一区| 国产精品一区二区电影| 久久视频免费在线播放| 97视频com| 69久久夜色精品国产69乱青草| 欧美日韩激情小视频| 中文字幕亚洲色图| 中国日韩欧美久久久久久久久| 国产91精品视频在线观看| 91亚洲一区精品| 欧美色播在线播放| 成人午夜激情免费视频| 国产一区二区在线免费| 68精品国产免费久久久久久婷婷| 欧美激情网友自拍| 夜夜嗨av色综合久久久综合网| 精品福利在线看| 欧美午夜激情小视频| 日韩精品在线影院| 久久久精品视频在线观看| 日日骚av一区| 国产日韩在线精品av| 日韩在线观看高清| 亚洲欧美综合区自拍另类| 国产精品第一第二| 亚洲在线www| 91chinesevideo永久地址| 国产一区二区日韩| 69国产精品成人在线播放| 久久国内精品一国内精品| 久久久av电影| 欧美日韩国产综合视频在线观看中文| 欧美激情性做爰免费视频| 国内精品久久久久久影视8| 国产成人一区二区在线| 91精品国产高清自在线看超| 精品国产福利视频| 亚洲免费成人av电影| 亚洲精品免费网站| 久久久久久久久久久91| 久久久人成影片一区二区三区| 国产精品视频中文字幕91| 日韩经典第一页| 亚洲人成毛片在线播放| 欧美黑人巨大xxx极品| 青青草99啪国产免费| 亚洲精品国产免费| 精品爽片免费看久久| 亚洲成人性视频| 日韩视频第一页| 亚洲人成网站777色婷婷| 国产aⅴ夜夜欢一区二区三区| 亚洲国产精品电影| 亚洲性无码av在线| 亚洲人成自拍网站| 在线观看欧美日韩国产| 日韩欧美国产高清91| 一区二区三区视频观看| 亚洲欧美国产视频| 国产精品久久久久久久久久久久久久| 欧美性猛交xxxx乱大交极品| 亚洲精品久久久一区二区三区| 91在线中文字幕| 91久久久久久久久久| 久久久久久久97| 91久久嫩草影院一区二区| 日韩在线观看精品| 26uuu另类亚洲欧美日本一| 精品视频9999| 亚洲午夜色婷婷在线| 亚洲激情中文字幕| 国产91av在线| 中文字幕日韩av| 精品久久久久久久久国产字幕| 亚洲欧美日韩天堂| 国产精品一区二区三区久久久| 国产精品视频在线观看| 亚洲国产精品久久91精品| 国产91精品高潮白浆喷水| 在线亚洲欧美视频| 国内免费精品永久在线视频| 久久91亚洲人成电影网站| 在线成人激情视频| 欧美怡春院一区二区三区| 91tv亚洲精品香蕉国产一区7ujn| 久久综合国产精品台湾中文娱乐网| 久久在精品线影院精品国产| 国产精品久久久久久久9999| 国产日韩精品入口| 国产在线视频欧美| 亚洲色图50p| 久久久久久999| 日本精品在线视频| 国产视频精品一区二区三区| 一区二区亚洲精品国产| 国产精品欧美久久久| 亚洲日本欧美日韩高观看| 久久久久久国产免费| 国产精品免费网站| 97国产suv精品一区二区62| 久久人人看视频| 久久久久久久久久婷婷| 92国产精品视频| 亚洲国产成人爱av在线播放| 国产做受高潮69| 姬川优奈aav一区二区| 成人黄色免费在线观看| 亚洲影视中文字幕| 亚洲精品视频二区| 日韩精品视频中文在线观看| 国产精品www色诱视频| 日韩免费在线观看视频| 欧美激情精品久久久久久黑人| 亚洲va欧美va国产综合久久| 国产成一区二区| 欧美野外wwwxxx| 亚洲国产精品免费| 成人97在线观看视频| 欧美激情亚洲视频| 欧美日韩国产一区二区三区| 欧美诱惑福利视频| 久久久久国产精品免费| 国产精品久久久久久婷婷天堂| 欧美成年人视频网站欧美| 亚洲自拍小视频| 欧美精品免费在线| 国产乱人伦真实精品视频| 久久精品精品电影网| 91亚洲精品一区二区| 日韩精品欧美激情| 国产精品欧美日韩久久| 色偷偷偷亚洲综合网另类| 欧美激情久久久久| 91在线免费观看网站| 久久久久久久久网站| 国产在线一区二区三区| 中文字幕自拍vr一区二区三区| 国产精品欧美亚洲777777| 亚洲电影免费观看高清完整版在线观看| 免费91麻豆精品国产自产在线观看| 久久视频在线看| www.国产精品一二区| 亚洲第一页中文字幕| 国产在线久久久|