前言
PHP團隊宣布PHP8正式GA(鏈接)。php的發展又開啟了新的篇章,PHP8.0.0版本引入了一些重大變更及許多新特性和性能優化機制.火速學習下~
JIT(Just in Time Compiler) 即時編譯器
JIT
是一種編譯器策略,它將代碼表述為一種中間狀態,在運行時將其轉換為依賴於體系結構的機器碼,並即時執行.在 PHP 中,這意味着 JIT 將為 Zend VM 生成的指令視為中間表述,並以依賴於體系結構的機器碼執行,也就是說托管代碼的不再是 Zend VM,而是更為底層的 CPU.其較之前的流程改動和重點如下(來源於PHP8 JIT的主要參與者鳥哥@風雪之隅)
左圖是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'<pre>';
echo($attributes[1]->getName().'<br>');
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.我愛你/tech/php80_newfeature_learning.html