首頁 >後端開發 >PHP8 >淺談PHP 8.2的更新進展

淺談PHP 8.2的更新進展

WBOY
WBOY轉載
2022-12-15 11:43:224901瀏覽

PHP 8.2 帶來了類型系統改進、只讀`readonly` 類別、敏感參數隱藏支援、新的隨機`random` 擴展,以及包括簡化和現代化PHP 在內的多項功能,下面一起來看一下,希望對大家有幫助。

淺談PHP 8.2的更新進展

推薦學習:《PHP影片教學

PHP 8.2 帶來了型別系統改進、唯讀readonly 類別、敏感參數隱藏支援、新的隨機random 擴展,以及包括簡化和現代化PHP 在內的多項功能。

PHP 8.2 是 PHP 邁入現代化的重要里程碑。除了令人興奮的新功能和改進之外,PHP 8.2 透過棄用動態屬性支援、對 INI 配置值發出警告和修復一系列數組排序和字串轉換的遺留行為。

型別系統改進

PHP 8.2 解決了數個原有型別系統的短處與限制,讓 PHP 專案得以擁有較好的型別安全性。這包括新增對 true 類型的支持,並允許將 nullfalse 用作獨立類型,同時增加了對 DNF 類型的支援。

Disjoint Normal Form (DNF) 類型支援- 在PHP 8.2 中,開發者可以組合使用聯合union 類型(PHP 8.0)和交集intersection類型(PHP 8.1),繼而允許聲明更精確的參數、傳回和屬性類型。

function process((HTMLRequest & RequestInterface) | APIRequest $request) {
 // ...
}

(HTMLRequest & RequestInterface) | APIRequest 類型宣告表示$request 必須是APIRequest# 的範例,或者實作了HTMLRequestRequestInterface

另一方面,在加入了truefalse 獨立類型後,可以將固定傳回值的bool 類型變更為具體的類型。

function alwaysReturnsFalse(): false {}

function alwaysReturnsNull(): null {}

function alwaysReturnsTrue(): true {}

在過去,我們已經可以透過string|null 的形式來定義可以為空的參數,而在PHP 8.2 中,我們將可以直接使用null 作為一個獨立類型。

只讀readonly 類別

PHP 8.1 新增了唯讀屬性支持,唯讀型別只能在初始化時被賦值一次,其後的修改會被PHP阻止。

而 PHP 8.2 將唯讀屬性延申到唯讀類別。當一個類別被宣告為唯讀類別後,它的所有屬性都會被自動宣告為唯讀。此外,它還會確保只讀類別中的所有屬性都帶有類型聲明。

// PHP 8.2
readonly class User {
	public string $username;
	public int $uid;
}

// PHP 8.1 等效写法
class User {
	public readonly string $username;
	public readonly int $uid;
}

全新隨機 random 擴充

綜觀 PHP 歷史,它支援了各種隨機數產生器(RNG)。每種生成器都具有不同的效能、使用場景和安全性。而 PHP 8.2 將所有 RNG 相關的功能重構成一個名為 random 新擴充。

random 擴充功能與現有的API 保持相容,同時提供相同的功能,因此rand  mt_rand  random_bytes random_int 等函數可以繼續工作,沒有任何變化。但 random 擴充功能提供了全新的物件導向的 API 來產生具有模組化架構的隨機數,讓模擬 RNG 和提供新的 RNG 變得更加容易,使測試專案更加安全且便利。

Trait 中的常數

PHP 8.2 允許在 Trait 中定義常數。當然,你不能直接存取 Trait,但 Trait 中的常數會在被繼承時成為類別常數。

trait FooBar {
	const FOO = 'foo';
	private const BAR = 'bar';
	final const BAZ = 'baz';
	final protected const QUX = 'qux';
}

class Test {
	use FooBar;
}

echo Test::BAZ; // 'bar'

要注意的是,Trait 中的常數不可以和其他 Trait 或類別中的常數衝突。

支援隱藏敏感參數

PHP 8.2 新增了 #[\SensitiveParameter] 參數註解,用於在錯誤和堆疊資訊中隱藏實際值。

接受密碼、私鑰或其他敏感資訊的函數可以使用 #[\SensitiveParameter] 來隱藏特定值。如果發生錯誤或異常,對應的值會被替換為 \SensitiveParameterValue 物件。

PHP 的內建函數(如 password_hashpassword_verify)已使用 #[\SensitiveParameter] 參數註解。

- function passwordHash(string $password)  {

+ function passwordHash(#[\SensitiveParameter] string $password)  {
        debug_print_backtrace();
    }
    passwordHash('hunter2');
array(1) {
    [0]=> array(4) {
        ["file"]=> string(38) "..."
        ["line"]=> int(9)
        ["function"]=> string(3) "foo"
        ["args"]=> array(1) {
-           [0]=> string(38) "hunter2"
+           [0]=> object(SensitiveParameterValue)#1 (0) {}
        }
    }
}

新函數和類別

解析INI 容量ini_parse_quantity

ini_parse_quantity('256M'); // 268435456

保持CURL 連線curl_upkeep

PHP 8.2 Curl 擴充功能中的curl_upkeep 函數觸發底層Curl 函式庫運行必要的任務以保持Curl 連接處於活動狀態。此函數最常見的用例是透過定期呼叫 curl_upkeep 函數來保持 HTTP 持久連線 (Keep-Alive)。

获取加密密钥长度 openssl_cipher_key_length

在 PHP 8.2 OpenSSL 中,有一个名为 openssl_cipher_key_length 的新函数,它返回任何受支持的 OpenSSL 密码所需的密钥长度(以字节为单位)。

此功能消除了对 OpenSSL 密码操作所需密钥长度进行硬编码的需要。

openssl_cipher_key_length("CHACHA20-POLY1305"); // 32

openssl_cipher_key_length("AES-128-GCM"); // 16

openssl_cipher_key_length("AES-256-GCM"); // 32

重置记录的内存使用峰值 memory_reset_peak_usage

PHP 8.2 添加了一个名为 memory_reset_peak_usage 的新函数,用于重置由 memory_get_peak_usage 函数返回的峰值内存使用量。

这对于多次调用或迭代一个动作并且需要记录每次调用的峰值内存使用量的应用程序很有帮助。 如果没有 memory_reset_peak_usage 函数重置内存使用情况,memory_get_peak_usage 将会返回整个运行过程中的绝对峰值内存使用情况。

PHP 8.2 弃用情况

PHP 8.2 也带来了相当一部分弃用。当语法、函数或特性被弃用时,PHP 会发出弃用通知,该通知不会中断 PHP 应用,但会记录到错误日志中。

弃用动态属性

PHP 8.2 中最值得注意的弃用之一是它弃用了动态声明的类属性。虽然可以忽略错误,但建议在类中声明类属性,加上类型声明就更好了。

class User {
	public int $uid;
}

$user = new User();
$user->name = 'Foo';
Deprecated: Creation of dynamic property User::$name is deprecated in ... on

许多古老的 PHP 应用程序很可能会受到此更改的影响,因为它们在扩展时往往不声明类属性,或者随着变化多年来不断发展。

当然了,选择忽略或例外也是存在的:

  • 匿名类及其子类(stdClass

  • 具有 __get__set 魔术方法的类

  • 具有 #[AllowDynamicProperties] 注解的类

弃用 utf8_encodeutf8_decode 函数

PHP 8.2 终于弃用这两名字跟实际效果不一致的函数,虽然名为 utf8 但实际上是 Latin 1 (ISO-8859-1)。

大多数使用这些函数的 PHP 项目往往没有意识到这个问题。推荐的替代品包括 mbstringiconvintl 扩展以提供更好的功能。

弃用 ${var} 字符串格式

PHP 一直支持使用 foo {$bar} 模式的字符串变量插值,以及将美元符号放在大括号外的替代语法 foo ${bar}

在 PHP 8.2 中,将美元符号放在花括号外的替代语法已弃用。

已弃用 推荐替代
Hello ${name} Hello {$name}
Hello {var} Hello {$$var}

此外,PHP 8.2 还弃用了一些部分支持的 callable 模式和 Mbstring 扩展对 Base64、Uuencode、QPrint 和 HTML 实体编码的处理。

推荐学习:《PHP视频教程

以上是淺談PHP 8.2的更新進展的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.im。如有侵權,請聯絡admin@php.cn刪除