三分鐘了解PHP 7.4新特性

步履不停
發布: 2023-04-06 22:22:01
原創
6271 人瀏覽過

三分鐘了解PHP 7.4新特性

PHP 7.4中的新功能

  • 發布日期可能在2019 年12 月左右,尚待確認
  • 短閉包,可實現更簡潔的單行書寫
  • 預加載,以提高效能
  • 類別中的類型屬性
  • 自訂物件序列化新增一種(反)序列化對象的新方法
  • 改進型別差異
  • 簡化Null 合併運算子
  • FFI 為PHP 擴充開發開闢新機會
  • 棄用短開標籤
  • 在陣列中支援展開運算子
  • 閱讀以下內容以了解更多

#短閉包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的投票規則已經改變。

  • 他們將總是需要 2/3 的大半支援才能通過。
  • 投票時間不短,所有RFC必須至少開放 2 週。

參考文獻的反思 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) 强制转换不受影响。

更多PHP相关技术文章,请访问PHP教程栏目进行学习!

以上是三分鐘了解PHP 7.4新特性的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!