PHP 8.2預計將於今年11月釋出,最新的穩定版本是PHP 8.1.5。雖然現在還為時過早,但對更新的接受程度參差不齊。
但是,知道會發生什麼可以幫助您為最新的PHP版本做好準備。通過了解新功能和不推薦使用的功能,您可以瞭解更新可能如何影響開發。這些知識還可以幫助您為最終釋出做好準備。
在這篇文章中,我們將回顧最新的PHP版本。然後我們將介紹PHP 8.2中的新功能並討論釋出時間表。
PHP版本概述
PHP是WordPress的主要程式語言。它在將資料庫中的資料轉換為站點訪問者的HTML網頁方面起著至關重要的作用。
作為網站所有者或開發人員,您可能已經熟悉保持WordPress核心、主題和外掛更新的重要性。但是,讓您的PHP保持最新也很重要。
目前,WordPress建議至少使用PHP 7.4。舊版本不再獲得對安全更新和錯誤修復的積極支援。因此,升級到PHP的最新穩定版本可以帶來更好的站點安全性、增強的效能和更高階別的支援(我們強調穩定,因為WordPress尚不完全相容PHP 8.0,因此請謹慎處理更新)。
PHP 7.4引入了型別化屬性、下劃線數字分隔符和各種改進。從那時起,已經發布了更多的PHP迭代。
2020年11月釋出的PHP 8.0帶來了一些基本功能。除了語法和效能增強之外,該版本還包括:
- 命名引數
- 匹配語法
- Union型別
- Constructor Property Promotion
- JIT(影響PHP執行原始碼的方式)
一年後出現了PHP 8.1,這是最新的主要PHP版本。此更新包括重要功能,例如:
- Intersection型別
- 只讀屬性
- Enums
- Fibers
- 從不返回型別
掌握最新版本的PHP有助於提高網站的效能和安全性。但是,重要的是要知道在升級之前會發生哪些變化。如果您有興趣測試PHP 8.2的當前狀態,可以通過GitHub進行。
PHP 8.2中的新功能
PHP 8.2預計將於2022年底釋出。這是當前的釋出時間表,計劃於2022年11月24日釋出通用版本 (GA):
-
- 6 月 9 日:Alpha 1
- 6 月 23 日:Alpha 2
- 7 月 7 日:Alpha 3
- 7 月 19 日:封版
- 7 月 21 日:Beta 1
- 8 月 4 日: Beta 2
- 8 月 18 日: Beta 3
- 9 月 1 日:候選版本 1
- 9 月 15 日:候選版本 2
- 9 月 29 日:候選版本 3
- 10 月 13 日:候選版本 4
- 10 月 27 日:候選版本 5
- 11 月 10 日:候選版本 6
- 11 月 24 日: GA
根據PHP網站上的官方文件,應該有一些新特性和不推薦使用的功能。深入瞭解更詳細的PHP 8.2新特性、棄用、變更等。
新的memory_reset_peak_usage函式
PHP 8.2將包含一個名為memory_reset_peak_usage的新函式。它將重置memory_get_peak_usage函式返回的峰值記憶體使用量。
對於涉及多次呼叫操作並記錄每次迭代的峰值記憶體使用情況的情況,此功能將很有幫助。開發人員將能夠使用此新功能在請求的生命週期內的任何給定時間重置峰值記憶體使用量。
只讀類
在PHP 8.1中引入,只讀屬性將在PHP 8.2中擴充套件以新增語法糖,以便所有類屬性一次都是隻讀的:
readonly class Post { public function __construct( public string $title, public Author $author, public string $body, public DateTime $publishedAt, ) {} }
這將防止將動態屬性新增到類中。
Null和False獨立型別
在PHP 8.2中,false的返回型別將作為獨立型別使用,而不是嚴格的聯合型別,用於發生錯誤時,這已經是可能的:
function alwaysFalse(): false { return false; }
null型別也是如此。例如,作為獨立型別,與以前不同,NullPost::getAuthor()將只能返回null。
棄用動態屬性
動態屬性將在PHP 8.2中被棄用,導致PHP 9.0出現 ErrorException。這些屬性是在物件上設定的:
class Post { public string $title; } // … $post->name = 'Name';
動態屬性允許在沒有嚴格的類宣告的情況下建立類(例如,值物件)時具有靈活性。對於依賴動態屬性的開發人員來說,他們的棄用可能會成為一個問題,因為這會促使他們更多地進行靜態分析。出於這個原因,一些開發人員對PHP 8.2的這種變化感到擔憂。
但是,使用 __get 和 __set 的類仍將支援動態屬性,stdClass的物件也將如此。
或者,開發人員可以在這些屬性的類上使用在全域性名稱空間中宣告的新#[AllowDynamicProperties]attribute:
#[AllowDynamicProperties] class User() {} $user = new User(); $user->foo = 'bar';
雖然不建議這樣做,但另一種選擇是禁用棄用警告。
新的 /n 修飾符
PHP 8.2將包含對preg_* 函式系列的/n (no capture) modifier的支援。使用時,除了已命名的捕獲組之外,任何具有()meta-characters的組都不會捕獲。本質上,結果與將每個組標記為非捕獲相同。
此更改背後的原因是修飾符簡化了多個組的複雜正規表示式。開發人員可以將所有組標記為非捕獲,而不是將每個組都營銷為非捕獲。然後,他們可以選擇並命名需要捕獲的特定組。
在回溯中編輯引數
許多開發人員使用從程式碼庫跟蹤堆疊跟蹤和生產錯誤的服務。這些服務可以在出現問題時通知使用者。例如,在除錯應用程式時跟蹤呼叫堆疊很有幫助。
但是,有時堆疊跟蹤可能包含敏感資訊,例如使用者名稱和密碼。PHP 8.2將包含一個#[SensitiveParameter] 屬性,當出現問題時,該屬性將防止此資訊包含在堆疊跟蹤中:
function test( $foo, #[\SensitiveParameter] $bar, $baz ) { throw new Exception('Error'); } test('foo', 'bar', 'baz');
PHP 8.2將使用敏感引數從堆疊跟蹤中編輯私有資訊,使其更加安全。這些引數確保資料不會出現在錯誤日誌中。請注意,此屬性僅可用於引數。
棄用 ${} 字串插值
有多種方法可以使用PHP在字串中嵌入變數。但是,PHP 8.2將棄用兩種方法。第一個是在字串中使用 ${}:
"Hello ${world}";
第二個是使用 ${} (變數):
"Hello ${(world)}";
這對開發人員來說可能不是一個重大問題,因為兩種最流行的字串插值方法仍然有效。
棄用部分支援的可呼叫物件
另一個不推薦使用的更改是部分支援的callables。有多種方法可以在 PHP 中建立可呼叫物件。可以使用 $callable() 語法、user_call_func(/a_array) 或使用帶有回撥的函式呼叫帶或不帶引數的函式。
已棄用的可呼叫模式包括以下內容:
$callable = "self::method"; $callable = "parent::method"; $callable = "static::method"; $callable = ["self", "method"]; $callable = ["parent", "method"]; $callable = ["static", "method"]; $callable = ["MyClass", "MyParentClass::myMethod"]; $callable = [new MyClass(), "MyOtherClass::myMethod"];
從PHP 8.2開始,呼叫上述任何一個都將導致以下棄用通知:
class Test { public static function myMethod(): void { echo "Called"; } public static function call(): void { $callable = 'self::myMethod'; call_user_func($callable); } } $callable = Test::call(); // "Called";
但是,將這些可呼叫物件傳遞給is_callable函式或將它們與可呼叫引數型別一起使用不會生成棄用訊息。為了防止出現棄用通知,開發人員可以使用::class 魔術方法將可呼叫程式碼中的parent、self和static關鍵字轉換為各自的類名。
更改背後的部分原因是允許將可呼叫物件用於型別化屬性。它使它們不那麼依賴於上下文。
MySQLi不能再用libmysql編譯
過去,PHP支援兩個庫來連線MySQL資料庫:mysqlnd和libmysql。自PHP 5.4起,前者已成為預設庫。但是,可以通過擴充套件編譯MySQLi。
從PHP 8.2開始,將不支援使用libmysql編譯MySQLi擴充套件。嘗試這樣做會導致配置錯誤:
./configure --with-mysqli=FOO
不再支援將mysqli與外部庫連結
這不太可能對開發人員造成任何重大錯誤。但是,通過LDAP和SASL自動重新連線和身份驗證支援libmysql支援的兩個mysqlnd不可用的最大功能。
使您的WordPress PHP版本保持最新
作為開發人員,必須針對即將釋出的PHP版本測試您的程式碼。在這種情況下,開發人員應儘快開始針對PHP 8.2測試他們的程式碼,以確保您的程式碼在更新時不會破壞使用者的站點。
評論留言