PHP8.2釋出了,快來看看有什麼改動!

2022-12-09 22:00:18

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

PHP8.2是PHP語言現代化程序中的一個重要的里程碑。除了令人興奮地新特性和改進之外,PHP8.2還簡化了語言,取消了對動態類屬性的支援,在遇到某些非最優的ini設定時發出警告,並修復了一些影響PHP陣列排序和某些型別的字串轉換/編碼操作的遺留PHP行為。【推薦學習:】

系統改進

PHP8.2解決了PHP型別系統的幾個缺點和限制,允許PHP應用採用更好的型別安全。包括新增了true型別,允許null和false作為獨立的型別使用,並支援DNF型別(泛型解析)。

PHP8.2支援分離正規化型別,現在可以進行組合聯合型別和交際型別,這可以定義宣告精確而富有表現力的引數、返回值和屬性。

php8.2之前

class Foo {
    public function bar(mixed $entity) {
        if ((($entity instanceof A) && ($entity instanceof B)) || ($entity === null)) {
            return $entity;
        }

        throw new Exception('Invalid entity');
    }
}
登入後複製

現在

class Foo {
    public function bar((A&B)|null $entity) {
        return $entity;
    }
}
登入後複製

支援truefalse作為獨立的型別,如果bool始終相同的時候可以用它來宣告。

function alwaysReturnsFalse(): false {}

function alwaysReturnsNull(): null {}

function alwaysReturnsTrue(): true {}
登入後複製

其中null的型別在之前的版本中就可以在聯合型別宣告中使用,現在可以獨立使用了。

唯讀類

PHP8.1增加了一個readonly的屬性宣告。一個readonly的屬性只能設定一次,並且PHP會阻止任何作用域內的修改。

PHP8.2readonly宣告進行更進一步的使用,可以將類宣告為readonly。當一個類被宣告為readonly,它的所有屬性都會自動宣告readonly。此外,這個類不能使用動態屬性,以確保所有的屬性都是有定義的。

readonly class User {
    public string $username;
    public string $uid;
}
登入後複製

所有的屬性都會自動宣告城readonly

新的亂數擴充套件

PHP的歷史發展中,它支援各種各樣的亂數生成器,他們有不同程度的效能和不同的用例,並且適合安全應用程式。PHP8.2更進一步,將所有與亂數相關的功能重構為一個名為random的擴充套件。新的擴充套件不會破壞任何現有的介面使用,因此現有的randmt_rand函數將繼續工作,不需要任何更改。它還提供了一個物件介面,用可插拔的體系生成亂數,因此很容易模擬亂數生成器並提供新的亂數生成器,從而市PHP應用程式安全且易於測試。

trait常數

PHP8.2中,可以在trait中宣告常數。trait不能直接存取,但當類使用trait時,這些常數就變成了類的常數。

trait Foo
{
    public const CONSTANT = 1;
}

class Bar
{
    use Foo;
}

var_dump(Bar::CONSTANT); // 1
var_dump(Foo::CONSTANT); // Error
登入後複製

敏感引數支援

PHP8.2新增了一個內建引數屬性命名:#[\SensitiveParameter]。能夠使PHP在堆疊跟蹤和錯誤訊息中隱藏掉實際值。

我們經常會在引數或屬性中定義密碼、祕鑰或其他敏感資訊。當PHP發生錯誤時,這些值會被記錄下來。顯示到螢幕上或者記錄到紀錄檔中。這樣人們就能通過這些方式得到敏感資料。

比如下面的例子:

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) {}

  }
 }
}
登入後複製

hunter2不會被列印出來。

新的函數和類

解析INI數量值:ini_parse_quantity

PHP ini值識別成位元組。

ini_parse_quantity('256M'); // 268435456
登入後複製

curl維持活動:curl_upkeep

PHP8.2中,curl擴充套件會觸發底層curl庫來執行必要任務,以保持curl連線存活。最常見的用法就是定期呼叫curl_upkeep來實現http持久連線(keep-alive

檢索密碼長度:openssl_cipher_key_length

PHP8.2 OpenSSL中,有一個名為openssl_cipher_key_length的函數,能夠接受任何支援的密碼所需的祕鑰長度,在之前需要寫死才能實現:

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

這對於多次呼叫或迭代呼叫時很有用。

PHP8.2中的棄用

PHP8.2也帶來了相當一部分的棄用。當語法、函數和特性被棄用時,PHP會發起一個棄用通知,該通知不應該中斷PHP程式,但會被記錄到錯誤紀錄檔中。

注意:PHP8.0以後,PHP的預設錯誤報告行為是E_ALL

已棄用動態屬性

PHP8.2中最值得注意的棄用之一就是棄用動態屬性。如果一個類屬性沒有宣告就被呼叫或賦值,就會退出程式。

class User {
    public int $uid;
}

$user = new User();
$user->name = 'Foo';
登入後複製

這個可能會影響到很多的的PHP遺留程式,推薦的修復方法是在型別中宣告屬性。

對此也有例外用法,比如stdClass和它的子類將正常使用,__get和__set魔術方法將正常使用,或者宣告#AllowDynamicProperties。

其他一些棄用可以關注本站其他文章:

PHP8.2中字串變數解析的新用法》https://phpreturn.com/index/a628de16a2adf8.html

安裝和升級到PHP8.2

PHP 8.2現在可以在所有常規原始碼中下載/安裝:

  • Windows:編譯後的二進位制檔案可在windows.php.net

  • Ubuntu/Debian: PHP 8.2可用ondrej/phpPPA

  • Fedora/RHEL/CentOS/Alma/Rocky:可以在Remi的源中獲取

  • Mac OS: PHP 8.2可以通過Homebrew安裝shivammathur/homebrew-php利用.

  • Docker:可以通過8.2*版本獲取PHP 8.2

2.png

3.png

原文地址:https://phpreturn.com/index/a639285aa925ed.html

原文平臺:PHP武器庫

更多程式設計相關知識,請存取:!!

以上就是PHP8.2釋出了,快來看看有什麼改動!的詳細內容,更多請關注TW511.COM其它相關文章!