php8.0正式版新特性和效能優化學習
阿新 • • 發佈:2020-11-27
## 前言
> PHP團隊宣佈PHP8正式GA(連結)。php的發展又開啟了新的篇章,PHP8.0.0版本引入了一些重大變更及許多新特性和效能優化機制.火速學習下~
## JIT(Just in Time Compiler) 即時編譯器
`JIT` 是一種編譯器策略,它將程式碼表述為一種中間狀態,在執行時將其轉換為依賴於體系結構的機器碼,並即時執行.在 PHP 中,這意味著 JIT 將為 Zend VM 生成的指令視為中間表述,並以依賴於體系結構的機器碼執行,也就是說託管程式碼的不再是 Zend VM,而是更為底層的 CPU.其較之前的流程改動和重點如下(來源於PHP8 JIT的主要參與者鳥哥@風雪之隅)
![image](https://www.laruence.com/medias/2020/06/Screen-Shot-2020-06-28-at-18.31.57.png)
左圖是PHP8之前的Opcache流程示意圖, 右圖是PHP8中的Opcache示意圖, 可以看出幾個關鍵點:
- Opcache會做opcode層面的優化,比如圖中的倆條opcode合併為一條
- PHP8的JIT目前是在Opcache之中提供的
- JIT在Opcache優化之後的基礎上,結合Runtime的資訊再次優化,直接生成機器碼
- JIT不是原來Opcache優化的替代,是增強
- 目前PHP8只支援x86架構的CPU
## match表示式
`match`是PHP8中新增的關鍵字(即無法再做類名),其作用與switch有點相似,用於變數的值轉換與賦值,使用如下
```
$input = true;
$result = match($input) {
"true",true => 1, //可多值匹配,匹配方式為===,無匹配值會丟擲Fatal error
"false" => 0,
"null" => NULL,
};
var_dump($result); //輸出: int(1)
```
## Attributes(註解)
`Attributes`即註解,它提供了一種向類新增元資料的方法,無需解析文件塊.符號為`#[]`,使用格式為`#[param('value1','value2')]`,可定義多個也可寫成陣列形式
```
#[
param('value1','value2'),
param2('value3','value4'),
]
```
且兩種形式可混合使用,如下
```
#[Url1("https://www.zhuyilong.fun")]
#[Params1("name1", "age1")]
#[
Params2("name2", "age2"),
Url2("https://www.zhuyilong.xn--6qq986b3xl/")
]
function newAttributes($arg = ''){}
$obj = new ReflectionFunction('newAttributes');
$attributes = $obj->getAttributes();
echo'
'; echo($attributes[1]->getName().'
'); print_r($attributes[2]->getArguments()); ``` 輸出為 ``` Params1 Array ( [0] => name2 [1] => age2 ) ``` ## 聯合型別Union Types `Union Types` 支援宣告並接收多個不同型別的值,它是兩種或多種型別的集合,使用時可以選擇其一 ``` function getParam(string|array|bool $p) { var_dump($p); } getParam(true);//輸出: bool(true) ``` ## static 返回型別 雖然已經可以返回 self,但是考慮到 PHP 具有動態型別的性質,PHP 8 中支援 static 返回型別將更加高效 ``` class Test { public $_name = 'test'; public function getStatic(): static { return new static(); } } $obj = new Test(); var_dump($obj->getStatic()->_name); //輸出: string(4) "test" ``` ## 弱對映WeakMap `WeakMap`弱對映的一般用例是將資料與單個物件例項關聯起來,而不強制它們保持活動狀態,從而在長時間執行的程序中有效地洩漏記憶體。例如,可以使用弱對映來記錄計算結果 ``` class FooBar { private WeakMap $cache; public function getSomethingWithCaching(object $obj) { return $this->cache[$obj] ??= $this->computeSomethingExpensive($obj); } // ... } ``` 如上程式碼所示,每個物件都只會呼叫一次computeSomethingExpensive方法,同時,如果物件被銷燬,它也會從對映中刪除快取值. --- > 文章個人網站地址: https://www.zhuyilong.xn--6qq986b3xl/tech/php80_newfeature_learn