PHP 8 發布首個Alpha 版本
按照發布計劃,PHP 8 將於今年11 月26 日發布,而原定於6 月18 日發布的第一個Alpha 版本跳票到了今天發布。PHP 8 是一個新的主要版本,它引入了一些重大變更,以及許多新特性和性能改進,下邊簡單介紹一些亮點:
下載地址:
JIT,Just-In-Time,即時編譯
最重大的特性非JIT莫屬。該特性的研發歷時多年,熬過了PHP 5與7大版本系列(PHP 6項目流產),直到去年3月份才最終通過投票確認將進入PHP 8。
JIT 是一種編譯器策略,它將代碼表述為一種中間狀態,在運行時將其轉換為依賴於體系結構的機器碼,並即時執行。在PHP 中,這意味著JIT 將為Zend VM 生成的指令視為中間表述,並以依賴於體系結構的機器碼執行,也就是說託管代碼的不再是Zend VM,而是更為底層的CPU 。
雖然自PHP 7.0 以來,通過優化核心數據結構HashTable、強化Zend VM 中某些操作碼與持續改進OPCache 的Optimizer 組件等具體措施,PHP 性能得到了顯著提升,但是實際上這些優化似乎已經走到極限了。現在JIT 從底層著手,被認為是目前提升PHP 性能的最佳出路。
關於引入JIT後的性能對比(以及PHP 8整體性能),可以參考一下本月 Phoronix的基準測試(注:用的是5月底的源碼構建版進行的測試)。
Union Types,聯合類型
Union Types支持接收多個不同類型的值,它是兩種或多種類型的集合,使用時可以選擇其一。包括PHP在內的開源生態的標準庫中使用聯合類型非常普遍,PHP支持聯合類型,將會允許將更多類型信息從phpdoc遷移至函數簽名。可以說,泛型之後,聯合類型是目前類型聲明系統中最大的突破口。
Attributes,註解
這裡的Attributes 也就是其它語言中的annotations(註解),它提供了一種向類添加元數據的方法,無需解析文檔塊。
新的static 返回類型
雖然已經可以返回self,但是考慮到PHP 具有動態類型的性質,PHP 8 中支持 static 返回類型將更加高效,對於許多開發者來說應當非常有用。
classFoo{ publicfunctiontest(): static{ returnnewstatic(); }}
WeakMap,弱映射
WeakMaps 允許創建從對像到任意值的映射(類似 SplObjectStorage),而不會阻止對用作key 的對象進行垃圾回收。只要將對象添加到WeakMap 中,GC 在觸發條件時就可以將其占用內存回收。
PHP 7.4 中,實際上已經引入了對WeakReference(弱引用)的支持。但是,原始的弱引用本身用途有限,而弱映射在實踐中更為常用。由於沒有提供註冊銷毀回調的功能,因此無法在PHP 弱引用之上實現有效的弱映射。弱映射的一般用例是將數據與單個對象實例相關聯,而不強迫它們保持活動狀態,避免長時間運行的進程無謂地佔用內存。
classFoo{ private WeakMap $cache; publicfunctiongetSomethingWithCaching(object $obj): object{ return$this->cache[$obj] ??= $this->computeSomethingExpensive($obj); }}
關於WeakMap/WeakReference,可以參考這一篇的WeakRef 部分,雖然講的是JS,但原理是相通的:
https://www.oschina.net/news/106670/what-s-new-in-javascript-google-io-2019
更多的相關特性可以查看:
- https://www.php.net/index.php#id2020-06-25-1
- https://wiki.php.net/rfc
- https://github.com/php/php-src/blob/master/UPGRADING
- https://derickrethans.nl/archive.html(Derick Rethans的博客,他是PHP核心貢獻者,也是PHP 7.4的release manager)
此外還注意到幾個處於投票階段的特性(也就是可能比較快會併入某個版本中的),像match expression(匹配表達式)與使用@@ 或#[] 替代<<>> 的提案都是比較值得關注的:
需要注意的是,PHP 8是一個重大更新版本,帶了一些重大變更,所以最好查看 UPGRADING 文檔的相關事項。不過實際上,其中許多重大變更在之前的7.*版本中已經引入,因此,如果你一直保持最新版本,那麼升級到PHP 8也影響不大。
另外,PHP 8中JIT主要貢獻者鳥哥@Laruence在此版本發布前也發表了相關文章,講述JIT的研發歷程,感興趣可以瞧瞧:寫在PHP8發布之前的話。