PHP 7.4 新特性

LeoYao發表於2019-05-23

短閉包 RFC

短閉包實現更簡潔的單行書寫。

array_map(function (User $user) { 
    return $user->id; 
}, $users)
array_map(fn(User $user) => $user->id, $users)

關於短閉包的一些注意事項:

  • 可以訪問父作用域,不需要 use 關鍵字。
  • $this 可以像普通的閉包一樣使用。
  • 短閉包只能包含一行,也就是 return 語句。

你可以在這裡深入閱讀它們。

型別屬性 RFC

類屬性可以提示型別:

class A
{
    public string $name;

    public Foo $foo;
}

改進的型別差異 RFC

之前寫過 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)
    { /* … */ }
}

Null 合併運算子 RFC

不再需要這樣做:

$data['date'] = $data['date'] ?? new DateTime();

你可以這樣做:

$data['date'] ??= new DateTime();

陣列展開運算子 RFC

現在你可以在陣列中使用展開運算子:

$arrayA = [1, 2, 3];

$arrayB = [4, 5];

$result = [0, ...$arrayA, ...$arrayB, 6 ,7];

// [0, 1, 2, 3, 4, 5, 6, 7]

請注意,這僅適用於帶數字鍵的陣列。

外部函式介面 RFC

外部函式介面,簡稱 FFI,允許從使用者區呼叫 C 程式碼。這意味著 PHP 擴充套件可以用純 PHP 編寫。

應該指出,這是一個複雜的話題。您仍然需要 C 知識才能正確使用此功能。

預載入 RFC

預載入是 PHP 核心的一個振奮人心的新功能,可以帶來不可預估的效能改進。

簡而言之:如果您今天使用的是框架,則必須在每次請求時載入和重新編譯其檔案。預載入允許伺服器在啟動時於記憶體中載入 PHP 檔案,並使它們持久化可用於所有後續請求(只要不停電)。

效能提升當然需要付出代價:如果預載入檔案的原始檔發生變化,則必須重新啟動伺服器(該部分若有異議,請檢視 RFC 詳細介紹)

自定義物件序列化 RFC

RFC 增加了兩個新的魔術方法:__serialize__unserialize 。這些方法和 __sleep 以及 __wakeup 的不同之處已經在 RFC 中進行了討論。

連線優先順序 RFC

如果你書寫了類似以下的內容:

echo "sum: " . $a + $b;

PHP 之前會像這樣編譯它:

echo ("sum: " . $a) + $b;

而 PHP 8 將使它如下編譯:

echo "sum :" . ($a + $b);

當在遇到沒有圓括號包含的 '+' 或 ' - ' 表示式之前有 '.' 的時候,PHP 7.4 會提示棄用警告。

RFC 投票流程改進

這在技術上不是與 PHP 7.4 相關的更新,但值得一提的是:RFC的投票規則已經改變。

參考文獻的反思 RFC

像 Symfony 的 var dumper 這樣的庫嚴重依賴於反射 API 來可靠地轉儲變數。以前,沒有對參考文獻提供適當的反映支援,導致這些庫依賴於黑客來檢測反映。

PHP 7. 4 新增了 ReflectionReference 解決此問題的類。

新增 mb_str_split 函式 RFC

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

永久支援 ext-hash RFC

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

預設不啟用 PEAR EXTERNALS

由於 PEAR 不再支援維護,核心團隊決定在 PHP 7.4 中刪除它的預設安裝。

密碼雜湊登錄檔RFC

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

棄用ext/wwdx RFC

此資料交換格式從未標準化,現在已經棄用該擴充套件。

PHP 短標籤被棄用 RFC

短開標籤 <? 已被棄用,將在 PHP 8 中刪除。短宣告標記 <?= 不受影響。

左關聯三元運算子被棄用 RFC

三元運算子在 PHP 中有一些奇怪的怪癖。此 RFC 為巢狀的三元語句新增了棄用。在 PHP 8 中,此棄用將轉換為編譯時錯誤。

1 ? 2 : 3 ? 4 : 5;   // deprecated
(1 ? 2 : 3) ? 4 : 5; // ok

向後不相容的更改 UPGRADING

升級PHP版本時,您應該始終檢視完整的 UPGRADING 文件

以下是一些突出顯示的向後不相容的更改:

  • 呼叫 var_dump 一個 DateTimeDateTimeImmutable 例項後面將不再保留物件的可訪問屬性。
  • openssl_random_pseudo_bytes 將在錯誤情況下丟擲異常。
  • 嘗試序列化一個 PDOPDOStatement 例項將生成一個 Exception 而不是一個 PDOException
  • 呼叫 get_object_vars() 上的 ArrayObject 例項將返回的屬性 ArrayObject 本身,而不是包裝的陣列或物件的值。請注意,(array) 強制轉換不受影響。

參考

相關文章