PHP 8發佈啦!來講說PHP 8 的新特性

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() 如今有一種通用的方法能夠將 DateTimeDatetimeImmutable 對象相互轉換。

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+「平臺」

在這裏插入圖片描述

在這裏插入圖片描述


更多學習內容能夠訪問【對標大廠】精品PHP架構師教程目錄大全,只要你能看完保證薪資上升一個臺階(持續更新)

以上內容但願幫助到你們,不少PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那裏入手去提高,對此我整理了一些資料,包括但不限於:分佈式架構、高可擴展、高性能、高併發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階乾貨須要的能夠免費分享給你們,須要的能夠加入個人 PHP技術交流羣

相關文章
相關標籤/搜索