PHP 8.1 編程語言發布

經過一年的開發,PHP 8.1 程式語言發布了。 新分支包含一系列新功能,以及一些破壞相容性的變更。

PHP 8.1 的主要改進:

  • 新增了對枚舉的支持,例如,您現在可以使用以下結構: enum Status { case Pending; 個案活躍; 案例已存檔; } class Post { public function __construct( private Status $status = Status::Pending; ) {} public function setStatus(Status $status): void { // … } } $post->setStatus(Status::Active);
  • 新增了對稱為 Fibers 的輕量級執行緒的支持,它允許您在較低層級管理執行緒。 計劃將 Fiber 支援添加到 Amphp 和 ReactPHP 框架。 $ Fiber = new Fiber(function (): void { $valueAfterResuming = Fiber::suspend('暫停後'); // ... }); $valueAfterSuspending = $fibre->start(); $ Fiber->resume('恢復後');
  • 目標程式碼快取(opcache)的實作已改進,使得快取有關類別繼承的資訊成為可能。 優化可以將某些應用程式的效能提高 5-8%。 其他最佳化包括JIT操作的最佳化、ARM64架構(AArch64)的JIT支援的實作、名稱解析加速、timelib和ext/date函式庫的最佳化、序列化和反序列化效能的提高、get_declared_classes()、explode()的最佳化、strtr() 函數、strnatcmp()、dechex()。 整體而言,Symfony Demo 的效能提升了 23.0%,WordPress 的效能提升了 3.5%。
  • 數組“...$var”內的解包運算子允許在定義新數組時替換現有數組,已擴展為支援字串鍵(以前僅支援數字標識符)。 例如,您現在可以在程式碼中使用: $array1 = [“a” => 1]; $array2 = ["b" => 2]; $array = [“a” => 0, …$array1, …$array2]; var_dump($數組); // [“a”=> 1,“b”=> 2]
  • 允許在初始化程序中使用“new”關鍵字,例如在函數定義中作為預設參數或在參數屬性中。 類別 MyController { public function __construct( private Logger $logger = new NullLogger(), ) {} }
  • 可以將類別屬性標記為唯讀存取(此類屬性中的資訊只能寫入一次,之後將無法變更)。 class PostData { public function __construct( public readonly string $title, public readonly DateTimeImmutable $date, ) {} } $post = new Post('Title', /* … */); $post->title = '其他'; > 錯誤:無法修改唯讀屬性 Post::$title
  • 可呼叫物件實作了新語法 - 現在可以透過呼叫函數並將值「...」作為參數傳遞給它來形成閉包(即 myFunc(...) 而不是 Closure::fromCallable('myFunc) ') ): function foo (int $a, int $b) { /* ... */ } $foo = foo(...); $foo(a: 1, b: 2);
  • 新增了對交叉類型的全面支持,可讓您透過組合現有類型來建立新類型。 與定義兩個或多個類型的集合的聯合類型不同,交集類型不需要存在任何列出的類型,而是需要填入集合中的所有指定類型。 函式generateSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) 。 $post->getId(); }
  • 有一種新類型「never」可用來通知靜態分析器某個函數將終止程式執行,例如透過引發例外狀況或執行退出函數。 函數 dd(mixed $input): never { exit; }
  • 提出了一個新函數 array_is_list,它允許您確定數組中的鍵從 0 開始按照數值遞增的順序排列: $list = [“a”, “b”, “c”]; array_is_list($list); // true $notAList = [1 => “a”, 2 => “b”, 3 => “c”]; array_is_list($notAList); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($alsoNotAList); // 錯誤的
  • 現在您可以使用“final”關鍵字來防止父類常數被覆寫。 類別 Foo { 最終 public const X = "foo"; } class Bar 擴展了 Foo { public const X = "bar"; > 致命錯誤:Bar::X 無法覆寫最終常數 Foo::X }
  • 建議使用 fsync 和 fdatasync 函數強制從磁碟快取儲存變更。 $file = fopen("sample.txt", "w"); fwrite($file, "部分內容"); if (fsync($file)) { echo "檔案已成功儲存至磁碟。"; fclose($文件);
  • 除了先前使用的前綴“0”之外,還添加了對八進制數使用前綴“0o”和“0O”的功能。 016 === 0o16; // 真 016 === 0O16; // 真的
  • 建議選擇性地限制 $GLOBALS 的使用,這將導致違反向後相容性,但可以顯著加快數組操作的速度。 例如,正在考慮停用寫入 $GLOBALS 並透過指標傳遞 $GLOBALS 的可能性。 對 2000 個軟體包的分析顯示,其中只有 23 個軟體包會受到此變更的影響。 例如,如果提案獲得批准,8.1 將不再支援以下表達式:$GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBALS; 取消設定($GLOBALS); by_ref($GLOBALS);
  • 內部方法現在應該傳回正確的類型。 在 PHP 8.1 中,傳回與函數宣告不符的類型將產生警告,但在 PHP 9.0 中,警告將會替換為錯誤。
  • 將功能從使用資源轉移到操作對象的工作仍在繼續。 finfo_* 和 imap_* 函數已轉移到物件。
  • 將空值作為參數傳遞給標記為不可空的內部函數已被棄用。 在 PHP 8.1 中,使用 str_contains("string", null) 等結構將導致警告,而在 PHP 9 中將導致錯誤。
  • 新增了對 MurmurHash3 和 xxHash 哈希演算法的支援。

來源: opennet.ru

添加評論