PHP 8.2 的新增功能:全面概述

已發表: 2023-10-17
在社交檔案上分享。

PHP 是一種廣泛使用的伺服器端腳本語言,它不斷發展以滿足不斷變化的 Web 開發需求。 PHP 8.2 於 2022 年 11 月發布,帶來了許多令人興奮的功能、重要的棄用和關鍵的錯誤修復。 在本文中,我們將深入探討 PHP 8.2 新增功能的值得注意的方面,闡明開發人員可以從這個最新版本中獲得什麼。

目錄

新功能

1. 枚舉:類型安全性簡介

8.2 版也許是 PHP 最令人期待的新增功能之一,它終於引入了對枚舉 (enum) 的本機支援。 枚舉允許開發人員定義一組具有明確類型的命名值,為 PHP 添加了重要的類型安全層。

這是一個列舉如何運作的簡單範例:

 enum Color { case RED; case GREEN; case BLUE; }

枚舉還可以具有關聯值,使其適用於各種用例。 此功能特別有利於確保您的程式碼保持可讀性、可維護性,且不易出現因濫用常數或幻數而產生的錯誤。

2. 建構子提升:減少樣板程式碼

PHP 8.2 引入了建構函數提升,該功能旨在簡化類別定義並減少樣板程式碼。 透過建構函式提升,您可以直接在建構函式的參數清單中宣告和初始化類別屬性。 這消除了單獨的屬性聲明的需要,使您的程式碼更簡潔且更易於維護。

 class User { public function __construct( public string $name, public string $email, public ?string $bio = null ) {} }

在處理具有許多屬性的類別時,建構函式提升尤其有價值,因為它可以減少程式碼庫中的混亂。

3.只讀類

在 PHP 8.2 中,唯讀類別使開發人員能夠定義具有隻能設定一次的屬性的類,通常是在物件建立期間。 這確保了屬性在物件的整個生命週期中保持不變。 只讀屬性使用 readonly 修飾符聲明,並且必須在類別建構子中初始化它們。

使用 PHP 8.2,該過程已徹底簡化:

 class ReadOnlyClass $publicpassword , #[\SensitiveParameter] $secretpassword ) { throw new \Exception('Error'); } passwords('publicpassword', 'secretpassword');

4.“include”和“require”語句中的命名參數

在 PHP 8.2 中,現在可以在包含或需要檔案時使用命名參數。 此功能增強了程式碼的可讀性,特別是在處理接受多個參數的函數時。

 include filename: 'my_file.php', once: true;

透過為這些參數提供名稱,可以使程式碼更加不言自明,並減少由於參數順序不正確而引入錯誤的可能性。

5. 隱式括號的棄用通知

為了提高程式碼的一致性和可讀性,PHP 8.2 引入了對不帶括號呼叫的函數和方法的棄用通知。 雖然還不是一個錯誤,但這可以作為一個警告,警告開發人員接受在呼叫函數時一致使用括號的建議做法。

 // Deprecated usage myFunction; // Recommended usage myFunction();

透過阻止隱式括號,PHP 旨在增強程式碼的清晰度和可維護性。

6. 支援隱藏敏感參數值

PHP 提供了在任何給定程式狀態下監視呼叫堆疊的功能,這在解決應用程式問題時特別有價值。 然而,在某些情況下,堆疊追蹤可能包含需要隱藏的機密細節。

在 PHP 8.2 中,將引入一個名為「SensitiveParameter」的新穎屬性。 此屬性用於在應用程式遇到錯誤時混淆敏感數據,使其不被顯示或記錄。 實際上,它的用法如下:

 function passwords( $publicpassword , #[\SensitiveParameter] $secretpassword ) { throw new \Exception('Error'); } passwords('publicpassword', 'secretpassword');

7. mysqli_execute_query函數和mysqli::execute_query方法介紹

PHP 是一種用於 Web 開發的多功能腳本語言,不斷發展以增強其功能和易用性。 在 PHP 8.2 中,開發人員可以預見將引入兩個新功能:mysqli_execute_query 函數和 mysqli::execute_query 方法。 這些新增功能旨在簡化資料庫交互,使使用 MySQL 資料庫變得更加方便。

mysqli_execute_query 函數

mysqli_execute_query 函數是 PHP MySQLi 擴充功能的強大補充。 它專門針對 MySQL 資料庫執行 SQL 查詢。 此函數提供了一種簡單有效的方式來傳送 SQL 查詢和檢索結果。 以下是其用法的簡短範例:

 $mysqli = new mysqli("localhost", "username", "password", "database"); $sql = "SELECT * FROM users WHERE status = ?"; $stmt = $mysqli->prepare($sql); $status = "active"; $stmt->bind_param("s", $status); $result = mysqli_execute_query($stmt); while ($row = $result->fetch_assoc()) { } $stmt->close(); $mysqli->close();

mysqli_execute_query 函數簡化了準備和執行查詢的過程,同時透過參數綁定保持安全性。

mysqli::execute_query 方法

除了新函數之外,PHP 8.2 還引入了 mysqli::execute_query 方法作為 MySQLi 類別的一部分。 此方法為喜歡物件導向程式設計的開發人員簡化了查詢執行。 這是其用法的範例:

 $mysqli = new mysqli("localhost", "username", "password", "database"); $sql = "SELECT * FROM products WHERE category = ?"; $stmt = $mysqli->prepare($sql); $category = "electronics"; $stmt->bind_param("s", $category); $result = $stmt->execute_query(); while ($row = $result->fetch_assoc()) {} $stmt->close(); $mysqli->close();

mysqli::execute_query 方法提供了一種物件導向的方法來執行資料庫查詢,為喜歡這種編碼風格的開發人員提供了更直觀的體驗。

8. 允許特徵中存在常數:增強程式碼的可重複使用性和可維護性

Traits 是包括 PHP 在內的現代程式語言中的重要功能,它允許開發人員在不同的類別之間重複使用程式碼,而無需繼承。 PHP Trait 主要提供方法,但在 PHP 8.2 中,引入了一個顯著的增強:在 Trait 中定義常數的能力。 此功能旨在改進程式碼組織、可重複使用性和可維護性,為開發人員提供更大的程式碼設計彈性。

PHP 中 Traits 的作用

在深入研究 Trait 中加入常數之前,我們先簡單回顧一下 Trait 在 PHP 中的作用。 Traits 是 PHP 等單繼承語言中程式碼重用的機制。 它們允許您定義一組可以在多個類別中重複使用的方法。 當類別使用特徵時,它會繼承該特徵中定義的方法,從而增強程式碼模組化並減少冗餘。

 trait Loggable { public function log($message) { }} class User { use Loggable; public function register() { $this->log('User registered.'); }}

在此範例中,Loggable Trait 提供了一個 log 方法,任何包含該 Trait 的類別都可以使用該方法,從而提高了程式碼的可維護性和組織性。

特徵中的常數:一個新功能

在 PHP 8.2 中,開發人員現在可以在特徵中定義常數,這在先前的 PHP 版本中是不可能的。 特徵中的常數與類別中的常數類似,但可以在使用該特徵的類別中存取它們。

 trait Configuration {
const MAX_CONNECTIONS = 10;
}class Database {
use Configuration;
public function connect() { $maxConnections = self::MAX_CONNECTIONS; } }

在此範例中,Configuration 特徵定義了 MAX_CONNECTIONS 常數,可以在使用該特徵的 Database 類別中存取該常數。 這允許集中配置常數並促進更有組織和可維護的程式碼結構。

9. PHP 8.2 中引入新的析取範式 (DNF) 類型

PHP 是一種動態且多功能的腳本語言,不斷發展以滿足 Web 開發不斷增長的需求。 隨著 PHP 8.2 的發布,開發人員將享受到新的析取範式 (DNF) 類型的引入。 該語言的這項新增功能增強了 PHP 的表達能力和靈活性,使開發人員能夠更有效地處理複雜的邏輯表達式。

了解析取範式 (DNF)

在深入研究 PHP 8.2 中的新 DNF 類型之前,有必要了解析取範式 (DNF) 在邏輯中代表什麼。 DNF 是表示邏輯表達式的規範形式,其中每個表達式都是連接詞 (AND) 的析取 (OR)。 簡單來說,它是一種將複雜的邏輯語句分解為一系列由 OR 運算子連接的簡單條件的方法。

例如,DNF 中的邏輯表達式 (A AND B) OR (C AND D) 是因為它是兩個連接詞的或取。

PHP 8.2 中的新 DNF 類型

PHP 8.2 引進了新的 DNF 類型,作為更直觀地使用和操作邏輯表達式的方式。 這些 DNF 類型提供了處理複雜邏輯的更高層級的抽象,使開發人員可以更輕鬆地管理程式碼中的複雜條件。

以下是新 DNF 類型及其使用方法的概述:

1. 析取範式

DisjunctiveNormalForm 類型表示 DNF 中的邏輯表達式。 您可以建立實例 DisjunctiveNormalForm 來封裝複雜的條件:

 $dnfExpression = new DisjunctiveNormalForm(
new Conjunction('A', 'B'),
new Conjunction('C', 'D')
);

在此範例中,$dnfExpression 表示 DNF 表達式 (A AND B) OR (C AND D)。

2. 連接詞

連線類型表示一個或多個條件的連線 (AND)。 您可以建立 Conjunction 實例來建立複雜的連接詞:

 $conjunction = new Conjunction('A', 'B', 'C');

這裡,$conjunction 代表連接詞(A AND B AND C)。

3.邏輯值

LogicalValue 類型表示簡單的邏輯值,可以是 true、false 或變數。 它可以與其他 DNF 類型結合使用來建立更複雜的表達式:

 $value = new LogicalValue('A');

這裡,$value代表邏輯變數A。

10. 引進AllowDynamicProperties屬性:擴充PHP的彈性

「AllowDynamicProperties」屬性是 PHP 的一個顯著補充,特別是對於重視該語言動態特性的開發人員。 使用此屬性,您可以使物件能夠接受和操作其類別中未明確定義的屬性。

以下是如何套用「AllowDynamicProperties」屬性的簡單範例:

 class DynamicObject {
}
$dynamicObj = new DynamicObject();
$dynamicObj->newProperty = "This is a dynamic property.";
echo $dynamicObj->newProperty;

在此範例中,「DynamicObject」類別標示為「AllowDynamicProperties」屬性,該屬性允許動態新增和存取屬性。 在處理需要適應各種資料結構的物件或處理來自外部來源(例如 API)的資料時,這種動態行為特別有用。

PHP 8.2 中的棄用與刪除

  • 擴展: PHP 8.2 告別了幾個過時且未維護的擴展,包括「oci8」、「mysql」、「mcrypt」和「interbase」。 強烈鼓勵依賴這些擴充功能的開發人員遷移到現代替代方案,以確保其應用程式的安全性和穩定性。
  • each() 函數:each() 函數現已在 PHP 8.2 中正式棄用。 此函數用於透過推進內部指標並傳回當前鍵值對來迭代數組。 然而,它有各種問題,並且在很大程度上被 foreach 循環所取代,後者提供了更好的可讀性和可維護性。
  • create_function() 函數:create_function() 函數被標記為已棄用。 此函數用於動態建立匿名函數,但由於安全性問題和閉包等更好的替代方案,不建議使用。
  • FILTER_SANITIZE_MAGIC_QUOTES 過濾器標誌:FILTER_SANITIZE_MAGIC_QUOTES 過濾器標誌已棄用。 此標誌與 filter_var() 一起使用,透過在單引號和雙引號等字元前添加斜線來清理輸入。 現代最佳實踐建議使用準備好的語句和參數化查詢來處理資料庫輸入,從而使該標誌過時。
  • stristr() 函數:stristr() 函數對字串中的子字串執行不區分大小寫的搜索,已被棄用。 雖然它仍然有效,但鼓勵開發人員使用不區分大小寫的版本 stripos() 或替代品 str_contains() 以獲得更好的清晰度。
  • 具有陣列參數的define() :現在不建議使用define() 來定義帶有陣列的常數作為值。 儘管可以用數組定義常數作為值,但這種做法被認為是非常規的,常數通常應該具有標量值。
  • SORT_NUMERIC 和 SORT_REGULAR 標誌:用於排序函數(如 sort() 和 usort())的 SORT_NUMERIC 和 SORT_REGULAR 標誌已被棄用。 不再需要這些標誌,因為 PHP 會自動偵測元素的資料類型並相應地對它們進行排序。

性能改進

PHP 8.2 帶來了各種效能增強和最佳化。 雖然這些改進的程度可能會根據您的特定用例而有所不同,但升級到 PHP 8.2 可能會帶來一些顯著的效能優勢。 這些改進可以對高流量的應用程式或執行資源密集型任務的應用程式產生重大影響,使它們更具回應性和效率。

錯誤修復和穩定性

與任何新的 PHP 版本一樣,PHP 8.2 解決了許多錯誤和穩定性問題。 這些修復對於維護該語言的整體可靠性並確保 PHP 繼續成為 Web 開發的穩健選擇至關重要。

常見問題 - PHP 8.2 中的新增功能

為什麼在 PHP 8.2 中引入了隱式括號的棄用通知?

隱式括號的棄用通知透過警告開發人員在呼叫函數時使用括號來鼓勵一致的程式碼風格。 這增強了程式碼的清晰度和可維護性。

什麼是唯讀類,它們在 PHP 8.2 中如何運作?

PHP 8.2 中的唯讀類別使得屬性只能設定一次,通常是在物件建立期間,確保它們在物件的整個生命週期中保持不變。 只讀屬性是使用 readonly 修飾符宣告的。

PHP 8.2 中 mysqli_execute_query 函數和 mysqli::execute_query 方法如何簡化資料庫互動?

這些功能簡化了對 MySQL 資料庫執行 SQL 查詢的過程,提供了以流程方式或物件導向的方式傳送查詢和檢索結果的高效且安全的方法。

「AllowDynamicProperties」屬性如何擴充 PHP 8.2 中的彈性?

「AllowDynamicProperties」屬性允許物件接受和操作未在其類別中明確定義的屬性,從而增強了 PHP 的動態特性。

為什麼錯誤修復和穩定性在 PHP 8.2 中很重要?

PHP 8.2 中的錯誤修復和穩定性改進對於維護該語言的整體可靠性至關重要,透過解決問題並增強其穩定性,確保 PHP 仍然是 Web 開發的可靠選擇。

結論

總之,PHP 8.2 成為不斷發展的 Web 開發領域的關鍵里程碑。 憑藉廣泛的創新功能、增強的靈活性和效能優化,它可以滿足全球開發人員不斷變化的需求。

枚舉、建構函式提升、唯讀類別、命名參數和AllowDynamicProperties 屬性的引入使開發人員能夠編寫更清晰、更易於維護的程式碼。 此外,新的析取範式 (DNF) 類型為 PHP 帶來了進階邏輯操作功能,進一步擴展了其多功能性。 然而,隨著 PHP 的進步,它也告別了過時的擴充功能和功能,同時努力解決錯誤,確保它仍然是 Web 開發的可靠和安全的選擇。

相關內容:

如何修復「WordPress 停用需要更新 PHP」錯誤(2 種方法)

MySQL慢查詢日誌