PHP 屬性是在 PHP 8.0 中引入的。該版本標誌著該語言的一個重要里程碑,帶來了一些新功能和改進,包括引入用於向程式碼聲明添加元資料的屬性。
我第一次必須處理屬性是由於 Inspector 的 PHP 庫中的一個問題。檢查 GitHub。在深入研究解決方案之前,讓我們先概述一下屬性是什麼以及如何在 PHP 程式碼中使用它們。
屬性是一項強大的功能,可讓您將元資料新增至類別、方法或屬性等聲明。這些元資料可以透過程式方式檢索,為更乾淨、更有組織、更有效率的程式碼開闢了新的可能性。
請記住,屬性在運行時不起作用。它們將在反射 API 中可用,使您的應用程式能夠根據附加到類別、方法或屬性的屬性來了解您想要運行的內容。
PHP 附帶了幾個用於不同目的的內建屬性。以下是一些值得注意的:
將函數或方法標記為已棄用,表示應避免使用它,因為它可能會在未來版本中被刪除。
#[Deprecated("Use newFunction() instead")] function oldFunction() { // Function implementation }
確保子類別中的方法旨在覆寫父類別中的方法。
class Child extends Parent { #[Override] public function defaultMethod() { // Method implementation } }
如果defaultMethod()最終將在父類別中更改其名稱,則這不再是覆蓋。在這種情況下,PHP 將發出警告,因為我們明確聲明我們希望進行覆蓋並提醒我們有關未對齊的情況。
不管怎樣,一個好的IDE應該能讓我們不犯這樣的錯誤。
抑制特定程式碼段的特定警告。
#[SuppressWarnings("SomeWarning")] function someFunction() { // Function implementation }
現在,讓我們建立一個自訂屬性類別。當您想要將特定行為封裝在屬性中時,這非常有用。
#[Attribute] class CustomAttribute { public string $message; public function __construct(string $message) { $this->message = $message; } }
然後您可以在各種元素上使用此自訂屬性:
class MyClass { #[CustomAttribute("This is a custom attribute")] public $myProperty; #[CustomAttribute("Another custom attribute")] public function myMethod() { // Method implementation } }
讓我們探討一個實際的例子。假設您正在建立一個 Web 應用程序,並且您想要建立一個自訂屬性來定義字串的長度:
#[Attribute(Attribute::TARGET_PROPERTY)] class MaxLength { public int $maxLength; public function __construct(int $maxLength) { $this->maxLength = $maxLength; } }
在上面的範例中,我們限制了僅將屬性套用至類別屬性的能力。現在我們可以在 User 類別中使用它:
class User { #[MaxLength(20, message: "Username must be 20 characters or less")] public string $username; // Other properties and methods }
如同先前所提到的,將屬性加入屬性在執行過程中沒有影響。但我們現在可以使用反射檢索這些訊息,最終採取一些行動。
Symfony 和 Laravel 等最常使用的 PHP 框架已經採用屬性基本上取代「註解」。在 Symfony 5.2 或更高版本中,您可以聲明一個控制器並使用屬性將其連接到路由:
public class Arrayable implements \ArrayAccess { … public function offsetExists($offset) { return isset($this->data[$offset]); } … }
自 PHP 8 起,ArrayAccess 介面的定義改為:
透過使用屬性,他們強制聲明偏移函數中參數的資料類型。使用 LanguageLevelTypeAware 屬性,如果實作不提供參數的資料類型,則會引發「棄用警告」。
但在函數參數中宣告資料型別會破壞與不支援參數資料型別宣告的舊版 PHP 的相容性。
由於這只是對未來更改的警告,我們使用另一個內建 PHP 屬性來解決該問題以抑制警告:
public class Arrayable implements \ArrayAccess { … #[\ReturnTypeWillChange] public function offsetExists($offset) { return isset($this->data[$offset]); } … }
ReturnTypeWillChange 屬性只是告訴 PHP 我們了解語言的未來變化,我們已經規劃了必要的更新。
對於這一變化,它們肯定會在 PHP 9 中實現。
請記住要明智地使用屬性,保持程式碼庫乾淨且記錄齊全。這在 SaaS 產品開發中尤其重要,因為可擴展性、可維護性和效率至關重要。
Inspector是專為軟體開發人員設計的程式碼執行監控工具。您無需在伺服器層級安裝任何內容,只需安裝 composer 軟體包 即可開始使用。
與其他複雜的一體化平台不同,Inspector 非常簡單,並且對 PHP 友好。您可以嘗試我們的 Laravel 或 Symfony 套件。
如果您正在尋找有效的自動化、深入的見解以及將警報和通知轉發到您的訊息傳遞環境的能力,請免費嘗試 Inspector。註冊您的帳戶。
或在網站上了解更多:https://inspector.dev
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3