PHP 8,PHP 的一個新的大版本,預計將於 2020 年 12 月 3 日發佈,這意味着將不會有 PHP 7.5 版本。PHP8 目前正處於很是活躍的開發階段,因此在接下來的幾個月裏,狀況可能會發生很大的變化。php
在這篇文章中,我會維持一個最新的清單列表,列出預計會出現的新特性、性能提高和突破性的變化。因爲 PHP 8 是一個新的大版本,所以您的代碼被破壞的可能性更高。若是您始終保持運行 PHP 的最新版本,那麼升級相對來講就會輕鬆不少,由於在 7. * 版本中,大多數重大更改均已棄用。laravel
除重大更改外,PHP 8 還帶來了一些不錯的新功能,好比說 JIT 編譯器 , 聯合類型 , 屬性,以及更多。sql
重新特性開始,請記住 PHP8 仍處於活動開發階段,所以此列表將隨着時間的推移而增加。shell
聯合類型 rfc緩存
考慮到 PHP 動態語言類型的特性,如今不少狀況下,聯合類型都是頗有用的。聯合類型是兩個或者多個類型的集合,表示可使用其中任何一個類型。服務器
public function foo(Foo|Bar $input): int|float;
請注意,聯合類型中不包含 void
,由於 void
表示的含義是 「根本沒有返回值」。 另外,可使用 |null
或者現有的 ?
表示法來表示包含 nullable
的聯合體 :架構
public function foo(Foo|null $foo): void; public function bar(?Bar $bar): void;
JIT rfc併發
JIT — just in time — 編譯器雖然不老是在 Web 請求的上下文中,可是有望顯着地提升性能。目前尚未完成任何準確的基準測試,可是確定會到來。分佈式
若是您想進一步瞭解 JIT 對 PHP 的做用,能夠閱讀我寫過的另外一篇文章此處。函數
屬性 rfc
屬性在其餘語言中一般被稱爲 註解 ,提供一種在無需解析文檔塊的狀況下將元數據添加到類中的方法。
快速瀏覽一下,這裏有一份來自 RFC 的屬性示例:
use App\Attributes\ExampleAttribute; <<ExampleAttribute>> class Foo { <<ExampleAttribute>> public const FOO = 'foo'; <<ExampleAttribute>> public $x; <<ExampleAttribute>> public function foo(<<ExampleAttribute>> $bar) { } }
<<PhpAttribute>> class ExampleAttribute { public $value; public function __construct($value) { $this->value = $value; } }
若是您想深刻了解屬性如何工做以及如何構建本身的屬性,您能夠在此博客上閱讀有關深刻屬性的信息。
新增 static
返回類型 rfc
儘管已經能夠返回 self
,可是 static
直到 PHP 8 纔是有效的返回類型 。考慮到 PHP 具備動態類型的性質,此功能對於許多開發人員將很是有用。
class Foo { public function test(): static { return new static(); } }
新增 mixed
類型 rfc
有人可能將其稱爲必要的邪惡:mixed
類型讓許多人感受十分混亂。然而,有一個很好的論據支持去實現它:缺乏類型在 PHP 中會致使不少狀況:
函數不返回任何內容或返回空值
咱們須要多種類型的一種類型
咱們須要的是 PHP 中不能進行類型提示的類型
由於上述緣由,添加 mixed
類型是一件很棒的事兒。mixed
自己表明下列類型中的任一類型:
array
bool
callable
int
float
null
object
resource
string
請注意,mixed
不只僅能夠用來做爲返回類型,還能夠用做參數和屬性類型。
另外,還須要注意,由於 mixed
類型已經包括了 null
,所以 mixed
類型不可爲空。下面的代碼會觸發致命錯誤:
// 致命錯誤:混合類型不能爲空,null已是混合類型的一部分。 function bar(): ?mixed {}
throw
表達式 rfc
該 RFC 將 throw
從一個語句更改成一個表達式,這使得能夠在不少新地方拋出異常:
$triggerError = fn () => throw new MyError(); $foo = $bar['offset'] ?? throw new OffsetDoesNotExist('offset');
弱映射 rfc
基於在 PHP 7.4 中新增的 弱引用 RFC,PHP 8 中新增了 WeakMaps
(弱映射)的實現。 WeakMaps
(弱映射)在保持對一些對象的引用的同時,並不會組織這些對象被垃圾回收機制處理 。
以 ORM 爲例,它們一般實現保存對實體類的引用的緩存,從而提升實體類之間關聯的性能。 只要緩存中存在對這些實體類的引用,那麼這些類就沒法被垃圾回收機制回收,儘管除了緩存中,已經沒有別處再引用這些實體類,它們依然不會被垃圾處理機制處理。
若是這個緩存層使用了弱引用和弱映射,那麼 PHP 將會在這些實體類沒有任何其餘引用時,對其進行垃圾回收。 尤爲是對於 ORMs,它能夠管理一個請求中的數百個 (若是不是數千個) 實體;弱映射能夠提供一種更好的、對資源更友好的方式來處理這些對象。
下面是弱映射基本的例子,摘抄自 RFC :
class Foo { private WeakMap $cache; public function getSomethingWithCaching(object $obj): object { return $this->cache[$obj] ??= $this->computeSomethingExpensive($obj); } }
容許對對象使用 ::class rfc
一個很小可是頗有用的新特性:如今能夠在對象上使用 :: class
,而沒必要在對象上使用 get_class()
,它的工做方式跟 get_class()
相同。
$foo = new Foo(); var_dump($foo::class);
Non-capturing catches rfc
在 PHP 8 以前,不管什麼時候你想要捕獲一個異常,你都須要先將其存儲到一個變量中,無論這個變量你是否會用到。經過 Non-capturing catches
你能夠忽略變量,因此替換下面的代碼:
try { // Something goes wrong } catch (MySpecialException $exception) { Log::error("Something went wrong"); }
你如今能夠這麼作:
try { // Something goes wrong } catch (MySpecialException) { Log::error("Something went wrong"); }
請注意,必須始終指定類型,不容許將 catch 留空,若是你想要捕獲全部類型的異常和錯誤,須要使用 Throwable 做爲捕獲類型。
參數列表中的尾部逗號 rfc
當調用函數時已經支持尾部逗號,可是參數列表中仍然缺乏尾隨逗號支持。如今 PHP8 中容許這樣作,這意味着您能夠執行如下操做:
public function( string $parameterA, int $parameterB, Foo $objectfoo, ) { // … }
從接口建立 DateTime
對象
你已經可使用 DateTime::createFromImmutable($immutableDateTime)
從 DateTimeImmutable
對象建立一個 DateTime
對象, 而另外一種方法則更加取巧。經過添加 DateTime::createFromInterface()
和 DatetimeImmutable::createFromInterface()
如今有一種通用的方法能夠將 DateTime
和 DatetimeImmutable
對象相互轉換。
DateTime::createFromInterface(DateTimeInterface $other); DateTimeImmutable::createFromInterface(DateTimeInterface $other);
新增 Stringable
接口 rfc
Stringable
接口可用於鍵入提示任何字符串或實現__ toString()
的內容。此外,每當一個類實現__ toString()
時,它就會自動實現後臺接口,而無需手動實現。
class Foo { public function __toString(): string { return 'foo'; } } function bar(Stringable $stringable) { /* … */ } bar(new Foo()); bar('abc');
新增 str_contains()
函數 rfc
有些人可能會說這是早該發生的,但咱們最終沒必要再依賴 strpos 來知道一個字符串是否包含另外一個字符串。
無需這樣作:
if (strpos('string with lots of words', 'words') !== false) { /* … */ }
你能夠這樣作:
if (str_contains('string with lots of words', 'words')) { /* … */ }
新增 str_starts_with()
和 str_ends_with()
函數 rfc
這是另外兩個早該出現的函數,如今已在覈心函數中添加了這兩個函數。
str_starts_with('haystack', 'hay'); // true str_ends_with('haystack', 'stack'); // true
好了各位,以上就是這篇文章的所有內容了,能看到這裏的人呀,都是人才。以前說過,PHP方面的技術點不少,也是由於太多了,實在是寫不過來,寫過來了你們也不會看的太多,因此我這裏把它整理成了PDF和文檔,若是有須要的能夠
更多學習內容能夠訪問【對標大廠】精品PHP架構師教程目錄大全,只要你能看完保證薪資上升一個臺階(持續更新)
以上內容但願幫助到你們,不少PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那裏入手去提高,對此我整理了一些資料,包括但不限於:分佈式架構、高可擴展、高性能、高併發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階乾貨須要的能夠免費分享給你們,須要的能夠加入個人 PHP技術交流羣