> 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 當然,有的同...