[譯] 關於 PHP 7.4 的最新訊息

Zerin發表於2019-03-01

[譯] 關於 PHP 7.4 的最新訊息
PHP 7.4可能會在2019年12月的某個地方釋出。此頁面將同時收到定期更新。 最後更新時間是2019年1月14日

預載入

預載入是PHP核心的一個驚人的補充,可以帶來一些重大的效能改進。 簡而言之:如果您今天使用的是框架,則必須在每次請求時載入和重新編譯其檔案。 預載入允許伺服器在啟動時在記憶體中載入PHP檔案,並使它們永久可用於所有後續請求。 效能提升當然需要付出代價:如果預載入檔案的來源發生變化,則必須重新啟動伺服器。

設定強型別

類變數型別可以提前宣告:

class A
{
    public string $name;
    
    public Foo $foo;
}
複製程式碼

更新07-01:截至目前,已合併型別屬性,因此已確認PHP 7.4。

改進型別差別

我過去曾寫過 PHP 的型別系統,所以很高興看到一些改進實際上是在 PHP 的核心。 型別差異是一個值得自己的部落格文章的主題; 簡而言之:你將能夠使用協變返回型別......

class ParentType {}
class ChildType extends ParentType {}

class A
{
    public function covariantReturnTypes(): ParentType
    { /* … */ }
}

class B extends A
{
    public function covariantReturnTypes(): ChildType
    { /* … */ }
}
複製程式碼

和回撥引數

class A
{
    public function contraVariantArguments(ChildType $type)
    { /* … */ }
}

class B extends A
{
    public function contraVariantArguments(ParentType $type)
    { /* … */ }
}
複製程式碼

更新14-01:RFC目前處於投票階段,但看起來它會毫無問題地通過。

外部函式介面

外部函式介面,簡稱 FFI ,允許從使用者區呼叫 C程式碼。 這意味著 PHP 擴充套件可以用純 PHP 編寫。 應該指出,這是一個複雜的主題。 您仍然需要 C 的知識才能正確使用此功能。

空融合分配運算子

而不是這樣做:

$data['date'] = $data['date'] ?? new DateTime();
複製程式碼

你可以這樣做:

$data['date'] ??= new DateTime();
複製程式碼

更新22-01:此功能現在在PHP 7.4中合併。

獲取更多利潤

從技術上講,這不是與 PHP 7.4 相關的更新,但它絕對值得一提。 RFC 的投票規則已經改變:它們總是需要 2/3 的多數才能通過。

反射引用

像 Symfony 的 var 轉儲程式這樣的庫很大程度上依賴於反射 AP I來可靠地轉儲變數。 以前,沒有對引用的適當反射支援,導致這些庫依賴 hack 來檢測引用。 PHP 7.4 新增了 ReflectionReference 類來解決這個問題。 更新02-14:RFC已通過,PHP 7.4已確認更改。

mb_str_split 的新增

此函式提供與 str_split 相同的功能,但在多位元組字串上。

ext-hash 始終啟用

正如標題所說,此擴充套件現在可在所有 PHP 版本中安裝永久使用。

PEAR 預設情況下不啟用

由於 PEAR 不再維護,核心團隊決定使用 PHP 7.4 刪除其預設安裝。

密碼雜湊登錄檔

對如何使用雜湊庫進行內部更改,以便使用者可以更輕鬆地使用它們。

棄用 ext/wwdx

此資料交換格式從未標準化,現在不推薦使用其副檔名。

不向後相容的變化

升級 PHP 版本時,您應該始終檢視完整的 UPGRADING 文件。 以下是一些突出顯示的向後不相容的更改:

  • 在沒有父級的類中引用 parent :: 將生成編譯時錯誤而不是執行時錯誤。
  • DateTimeDateTimeImmutable 例項上呼叫var_dump 將不再在物件上留下可訪問的屬性。
  • openssl_random_pseudo_bytes 將在錯誤情況下丟擲異常。
  • 嘗試序列化 PDOPDOStatement 例項將生成異常而不是 PDOException
  • ArrayObject 例項上呼叫 get_object_vars() 將返回 ArrayObject 本身的屬性,而不是包裝陣列或物件的值。 請注意, (array) 強制轉換不受影響。

等一下......

如果你已經看到文章末尾了,你很可能對 PHP 感興趣。 也許你也有興趣閱讀我的其他內容? 以下是我寫的一些內容。 本人部落格 :iacblog 本人公眾號 :php_open

相關文章