PHP 8.2 更新速覽
Created time: December 8, 2022 10:50 PM
Last edited time: December 8, 2022 11:58 PM
轉(zhuǎn)自 PHP 8.2 Highlights: What’s New and Changed
? PHP 8.2 帶來了類型系統(tǒng)改進(jìn)、只讀 readonly
類、敏感參數(shù)隱藏支持、新的隨機(jī) random
擴(kuò)展,以及包括簡(jiǎn)化和現(xiàn)代化 PHP 在內(nèi)的多項(xiàng)功能。
PHP 8.2 是 PHP 邁入現(xiàn)代化的重要里程碑。除了令人興奮的新功能和改進(jìn)之外,PHP 8.2 通過棄用動(dòng)態(tài)屬性支持、對(duì) INI 配置值發(fā)出警告和修復(fù)一系列數(shù)組排序和字符串轉(zhuǎn)換的遺留行為?!就扑]:PHP視頻教程】
類型系統(tǒng)改進(jìn)
PHP 8.2 解決了數(shù)個(gè)原有類型系統(tǒng)的短處和限制,讓 PHP 項(xiàng)目得以擁有更好的類型安全性。這包括添加對(duì) true
類型的支持,并允許將 null
和 false
用作獨(dú)立類型,同時(shí)增加了對(duì) DNF 類型的支持。
Disjoint Normal Form (DNF) 類型支持 – 在 PHP 8.2 中,開發(fā)者可以組合使用聯(lián)合
union
類型(PHP 8.0)和交集intersection
類型(PHP 8.1),繼而允許聲明更加精確的參數(shù)、返回和屬性類型。
function process((HTMLRequest & RequestInterface) | APIRequest $request) { // ...}
(HTMLRequest & RequestInterface) | APIRequest
類型聲明表示 $request
必須是 APIRequest
的示例,或者實(shí)現(xiàn)了 HTMLRequest
和 RequestInterface
。
另一方面,在加入了 true
和 false
獨(dú)立類型后,可以將固定返回值的 bool
類型更改為具體的類型。
function alwaysReturnsFalse(): false {} function alwaysReturnsNull(): null {} function alwaysReturnsTrue(): true {}
在過去,我們已經(jīng)可以通過 string|null
的形式來定義可以為空的參數(shù),而在 PHP 8.2 中,我們將可以直接使用 null
作為一個(gè)獨(dú)立類型。
只讀 readonly
類
PHP 8.1 添加了只讀屬性支持,只讀類型只能在初始化時(shí)被賦值一次,其后的修改會(huì)被 PHP 阻止。
而 PHP 8.2 將只讀屬性延申到只讀類中。當(dāng)一個(gè)類被聲明為只讀類后,它的所有屬性都會(huì)被自動(dòng)聲明為只讀。此外,它還會(huì)確保只讀類中的所有屬性都帶有類型聲明。
// 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; }
全新隨機(jī) random
擴(kuò)展
縱觀 PHP 歷史,它支持了各種隨機(jī)數(shù)生成器(RNG)。每種生成器都具有不同的性能、使用場(chǎng)景和安全性。而 PHP 8.2 將所有 RNG 相關(guān)的功能重構(gòu)成名為 random
新擴(kuò)展。
random
擴(kuò)展與現(xiàn)有的 API 保持兼容,同時(shí)提供相同的功能,因此 rand
mt_rand
random_bytes
random_int
等函數(shù)可以繼續(xù)工作,沒有任何變化。但 random
擴(kuò)展提供了全新的面向?qū)ο蟮?API 來生成具有模塊化架構(gòu)的隨機(jī)數(shù),令模擬 RNG 和提供新的 RNG 變得更加容易,使測(cè)試項(xiàng)目更加安全且便利。
Trait 中的常量
PHP 8.2 允許在 Trait 中定義常量。當(dāng)然,你不能直接訪問 Trait,但 Trait 中的常量會(huì)在被繼承時(shí)成為類常量。
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 或類中的常量沖突。
支持隱藏敏感參數(shù)
PHP 8.2 新增了 #[SensitiveParameter]
參數(shù)注解,用于在錯(cuò)誤和堆棧信息中隱藏實(shí)際值。
接受密碼、私鑰或其他敏感信息的函數(shù)可以使用 #[SensitiveParameter]
來隱藏具體值。如果發(fā)生錯(cuò)誤或異常,對(duì)應(yīng)的值會(huì)被替換為 SensitiveParameterValue
對(duì)象。
PHP 的內(nèi)置函數(shù)(如 password_hash
和 password_verify
)已使用 #[SensitiveParameter]
參數(shù)注解。
- 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) {} } } }
新函數(shù)和類
解析 INI 容量 ini_parse_quantity
ini_parse_quantity('256M'); // 268435456
保持 CURL 連接 curl_upkeep
PHP 8.2 Curl 擴(kuò)展中的 curl_upkeep
函數(shù)觸發(fā)底層 Curl 庫(kù)運(yùn)行必要的任務(wù)以保持 Curl 連接處于活動(dòng)狀態(tài)。 此函數(shù)最常見的用例是通過定期調(diào)用 curl_upkeep
函數(shù)來保持 HTTP 持久連接 (Keep-Alive)。
獲取加密密鑰長(zhǎng)度 openssl_cipher_key_length
在 PHP 8.2 OpenSSL 中,有一個(gè)名為 openssl_cipher_key_length
的新函數(shù),它返回任何受支持的 OpenSSL 密碼所需的密鑰長(zhǎng)度(以字節(jié)為單位)。
此功能消除了對(duì) OpenSSL 密碼操作所需密鑰長(zhǎng)度進(jìn)行硬編碼的需要。
openssl_cipher_key_length("CHACHA20-POLY1305"); // 32 openssl_cipher_key_length("AES-128-GCM"); // 16 openssl_cipher_key_length("AES-256-GCM"); // 32
重置記錄的內(nèi)存使用峰值 memory_reset_peak_usage
PHP 8.2 添加了一個(gè)名為 memory_reset_peak_usage
的新函數(shù),用于重置由 memory_get_peak_usage
函數(shù)返回的峰值內(nèi)存使用量。
這對(duì)于多次調(diào)用或迭代一個(gè)動(dòng)作并且需要記錄每次調(diào)用的峰值內(nèi)存使用量的應(yīng)用程序很有幫助。 如果沒有 memory_reset_peak_usage
函數(shù)重置內(nèi)存使用情況,memory_get_peak_usage
將會(huì)返回整個(gè)運(yùn)行過程中的絕對(duì)峰值內(nèi)存使用情況。
PHP 8.2 棄用情況
PHP 8.2 也帶來了相當(dāng)一部分棄用。當(dāng)語(yǔ)法、函數(shù)或特性被棄用時(shí),PHP 會(huì)發(fā)出棄用通知,該通知不會(huì)中斷 PHP 應(yīng)用,但會(huì)記錄到錯(cuò)誤日志中。
棄用動(dòng)態(tài)屬性
PHP 8.2 中最值得注意的棄用之一是它棄用了動(dòng)態(tài)聲明的類屬性。雖然可以忽略錯(cuò)誤,但建議在類中聲明類屬性,加上類型聲明就更好了。
class User { public int $uid; } $user = new User(); $user->name = 'Foo';
Deprecated: Creation of dynamic property User::$name is deprecated in ... on
許多古老的 PHP 應(yīng)用程序很可能會(huì)受到此更改的影響,因?yàn)樗鼈冊(cè)跀U(kuò)展時(shí)往往不聲明類屬性,或者隨著變化多年來不斷發(fā)展。
當(dāng)然了,選擇忽略或例外也是存在的:
-
匿名類及其子類(
stdClass
) -
具有
__get
和__set
魔術(shù)方法的類 -
具有
#[AllowDynamicProperties]
注解的類
棄用 utf8_encode
和 utf8_decode
函數(shù)
PHP 8.2 終于棄用這兩名字跟實(shí)際效果不一致的函數(shù),雖然名為 utf8
但實(shí)際上是 Latin 1
(ISO-8859-1)。
大多數(shù)使用這些函數(shù)的 PHP 項(xiàng)目往往沒有意識(shí)到這個(gè)問題。推薦的替代品包括 mbstring
、iconv
和 intl
擴(kuò)展以提供更好的功能。
棄用 ${var}
字符串格式
PHP 一直支持使用 foo {$bar}
模式的字符串變量插值,以及將美元符號(hào)放在大括號(hào)外的替代語(yǔ)法 foo ${bar}
。
在 PHP 8.2 中,將美元符號(hào)放在花括號(hào)外的替代語(yǔ)法已棄用。
已棄用 | 推薦替代 |
---|---|
Hello ${name} | Hello {$name} |
Hello ${$var} | Hello {$$var} |
此外,PHP 8.2 還棄用了一些部分支持的 callable
模式和 Mbstring 擴(kuò)展對(duì) Base64、Uuencode、QPrint 和 HTML 實(shí)體編碼的處理。
php入門到就業(yè)線上直播課:立即學(xué)習(xí)
全程直播 + 實(shí)戰(zhàn)授課 + 邊學(xué) + 邊練 + 邊輔導(dǎo)