php8強型別,PHP8新特性盤點

2021-10-25 21:20:15 字數 2683 閱讀 6477

> php 8.0.0 已經正式發布了,這個對於phper無疑是乙個令人振奮的訊息。它包含了很多新功能與優化項, 包括命名引數、聯合型別、註解、構造器屬性提公升、`match `表示式、`nullsafe `運算子、`jit`,並改進了型別系統、錯誤處理、語法一致性。

## 最人性化的特性:命名引數、聯合型別、`mixed`型別

這幾個新特性讓php在強型別方面進一步完善,而且對phpdoc的注釋依賴越來越弱,**即文件的好處是開發者最頭疼的事情終於有辦法可以偷懶了。

### 命名引數

命名引數可以讓函式或者方法的呼叫更加清晰直觀,對於如下的函式定義

function foo(string $a, string $b, ?string $c = null, ?string $d = null)

你可以通過下面的方式傳入引數進行呼叫

foo(

b: 'value b',

a: 'value a',

d: 'value d',

最大的好處是傳入引數的順序是和定義無關的,而且還可以混合傳參(但不建議)。

### 聯合型別

相對於以前的 phpdoc 宣告型別的組合, 現在可以用原生支援的聯合型別宣告取而代之,可在實際執行中驗證。

php7

class number

## 最具貢獻的特性:`jit`

jit作為php底層編譯引擎,對於php8的效能貢獻是非常之大,不過對於常規web應用來說,優勢不明顯,但仍然是非常的高大上特性,是php8的扛鼎之作。

php 8 引入了兩個即時編譯引擎。 tracing jit 在兩個中更有潛力,它在綜合基準測試中顯示了三倍的效能, 並在某些長時間執行的程式中顯示了 1.5-2 倍的效能改進。 典型的應用效能則和 php 7.4 不相上下。

### 關於 jit 對 php 8 效能的貢獻

![just-in-time compilation](

## 最實用的特性:構造器屬性提公升、`nullsafe`運算子、`str_contains()`、 `str_starts_with()`、 `str_ends_with()`

### 構造器屬性提公升

這個新的語法糖來用來建立值物件或資料傳輸物件。不用為類屬性和建構函式指定它們,php 現在可以將它們合併為乙個。

代替如下**:

class money

public currency $currency;

public int $amount;

public function __construct(

currency $currency,

int $amount,

$this->currency = $currency;

$this->amount = $amount;

你可以這樣做:

class money

public function __construct(

public currency $currency,

public int $amount,

### `nullsafe`運算子

現在可以用新的 nullsafe 運算子鏈式呼叫,而不需要條件檢查 null。 如果鏈條中的乙個元素失敗了,整個鏈條會中止並認定為 null。

$country = null;

if ($session !== null)

你可以這樣做

if (str_contains('string with lots of words', 'words'))

感覺大多數場景應該是不需要使用`strpos`了吧,外兩個早就應該有了,`str_starts_with()`和`str_ends_with()`這兩個函式現在能省事不少。

str_starts_with('haystack', 'hay'); // true

str_ends_with('haystack', 'stack'); // true

## 最具潛力的特性:註解、`match`表示式、`weakmap`

### 註解

現在可以用原生的php語法來使用結構化的元資料,而不需要再依賴phpdoc解析,效能也隨之提公升。之前定義註解路由可能需要使用:

class postscontroller

* @route("/api/posts/", methods=)

public function get($id)

現在你可以直接用php的註解語法來定義,並通過反射直接獲取

class postscontroller

#[route("/api/posts/", methods: ["get"])]

public function get($id)

### `match`表示式

你可以稱它為switch表示式的大哥:match可以返回值,不需要break語句,可以組合條件,使用嚴格的型別比較,並且不執行任何型別的強制。

如下所示:

$result = match($input)

// this is forbidden (incorrect return type)

private function neededbythetrait(): stdclass

// this is forbidden (non-static changed to static)

private static function neededbythetrait(): string

php8強型別,PHP8新特性盤點

php 8.0.0 已經正式發布了,這個對於phper無疑是乙個令人振奮的訊息。它包含了很多新功能與優化項,包括命名引數 聯合型別 註解 構造器屬性提公升 match表示式 nullsafe運算子 jit,並改進了型別系統 錯誤處理 語法一致性。最人性化的特性 命名引數 聯合型別 mixed型別 這...

PHP 8中資料型別

php 一共支援八種資料型別 4種標量資料型別 boolean布林型 只有兩個值 true 和 flase integer整形 包括正整數和負整數,無小數字 float double 浮點型 用於儲存數字,有小數字 string 字串型別,可以儲存一切字元的集合 2種符合型別 array陣列,一切型...

PHP8新特性之match表示式

php8 alpha2發布了,最近引入了乙個新的關鍵字 match,這個關鍵字的作用跟switch有點類似。雖然我一般對語法糖無感,但這個我覺得還是有點意思,match這個詞也挺好看,那麼它是幹啥的呢?在以前我們可能會經常使用switch做值轉換類的工作,類似 switch input 當然,有的同...