1. 程式人生 > >php8.0正式版新特性和效能優化學習

php8.0正式版新特性和效能優化學習

## 前言 > 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