站長資訊網
        最全最豐富的資訊網站

        PHP 8.2 更新啦!一文速覽新功能

        PHP 8.2 更新速覽

        Created time: December 8, 2022 10:50 PM

        Last edited time: December 8, 2022 11:58 PM

        轉自 PHP 8.2 Highlights: What’s New and Changed

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

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

        類型系統改進

        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入門到就業線上直播課:立即學習
        全程直播 + 實戰授課 + 邊學 + 邊練 + 邊輔導

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 天天爽夜夜爽精品视频app| 香蕉国产精品频视| 国产精品免费观看| 一本一道久久a久久精品综合| 亚洲国语精品自产拍在线观看| 欧美精品VIDEOSSEX少妇| 九九热这里只有国产精品| 日本人精品video黑人| 岛国精品一区免费视频在线观看| 亚洲国产精品综合久久一线| 狠狠精品久久久无码中文字幕| 久久九九亚洲精品| 99精品国产在热久久| 久久国产乱子伦免费精品| 亚洲精品无码精品mV在线观看| 欧美国产精品久久高清| 国产精品 日韩欧美| 亚洲自偷自偷精品| 久久99国产精品二区不卡| 91精品欧美综合在线观看| 精品无码一区在线观看| 久久久久久夜精品精品免费啦 | 精品国产第一国产综合精品 | 国产成人亚洲综合无码精品| 日韩精品无码一区二区三区免费| 亚洲成人国产精品| 亚洲?V无码成人精品区日韩| 日本国产精品久久| 无码国模国产在线无码精品国产自在久国产 | 99在线精品免费视频九九视 | 亚洲AV成人精品网站在线播放 | 91精品在线看| 91在线视频精品| 99精品国产一区二区三区2021 | xxx国产精品视频| 精品国产91久久久久久久 | 亚洲中文字幕久久精品无码喷水 | 精品一区二区三区四区| 国产cosplay精品视频| 99精品全国免费观看视频..| 99国产欧美精品久久久蜜芽|