淺談PHP 8.2的更新進展

2022-12-15 14:00:48
8.2 帶來了型別系統改進、唯讀 `readonly` 類、敏感引數隱藏支援、新的隨機 `random` 擴充套件,以及包括簡化和現代化 PHP 在內的多項功能,下面一起來看一下,希望對大家有幫助。

php入門到就業線上直播課:進入學習
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API偵錯工具:

推薦學習:《》

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 8.2的更新進展的詳細內容,更多請關注TW511.COM其它相關文章!