首頁 >後端開發 >php教程 >PHP8.2發布了,快來看看有什麼改動!

PHP8.2發布了,快來看看有什麼改動!

青灯夜游
青灯夜游轉載
2022-12-09 21:05:366248瀏覽

PHP8.2發布了,快來看看有什麼改動!

PHP8.2是PHP語言現代化過程中的一個重要的里程碑。除了令人興奮地新特性和改進之外,PHP8.2還簡化了語言,取消了對動態類別屬性的支持,在遇到某些非最優的ini配置時發出警告,並修復了一些影響PHP陣列排序和某些類型的字串轉換/編碼操作的遺留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维持活动:<strong>curl_upkeep</strong>

PHP8.2中,curl扩展会触发底层curl库来运行必要任务,以保持curl连接存活。最常见的用法就是定期调用curl_upkeep来实现http持久连接(keep-alive

检索密码长度:<strong>openssl_cipher_key_length</strong>

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

重置记录的峰值内存使用量:<strong>memory_reset_peak_usage</strong>

这对于多次调用或迭代调用时很有用。

PHP8.2中的弃用

PHP8.2也带来了相当一部分的弃用。当语法、函数和特性被弃用时,PHP会发起一个弃用通知,该通知不应该中断PHP程序,但会被记录到错误日志中。

注意:PHP8.0以后,PHP的默认错误报告行为是E_ALL

已弃用动态属性

PHP8.2中最值得注意的弃用之一就是弃用动态属性。如果一个类属性没有声明就被调用或赋值,就会退出程序。

class User {
    public int $uid;
}

$user = new User();
$user->name = &#39;Foo&#39;;

这个可能会影响到很多的的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

PHP8.2發布了,快來看看有什麼改動!

PHP8.2發布了,快來看看有什麼改動!

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

原文平台:PHP武器库

更多编程相关知识,请访问:编程教学!!

以上是PHP8.2發布了,快來看看有什麼改動!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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