」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > PHP 屬性:如何使用 PHP 屬性並建立自訂屬性類別 – 快速提示

PHP 屬性:如何使用 PHP 屬性並建立自訂屬性類別 – 快速提示

發佈於2024-11-03
瀏覽:505

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

抑制特定程式碼段的特定警告。

#[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
}

如同先前所提到的,將屬性加入屬性在執行過程中沒有影響。但我們現在可以使用反射檢索這些訊息,最終採取一些行動。

PHP 框架的採用

Symfony 和 Laravel 等最常使用的 PHP 框架已經採用屬性基本上取代「註解」。在 Symfony 5.2 或更高版本中,您可以聲明一個控制器並使用屬性將其連接到路由:

public class Arrayable implements \ArrayAccess
{
    …

    public function offsetExists($offset)
    {
        return isset($this->data[$offset]);
    }

    …
}

自 PHP 8 起,ArrayAccess 介面的定義改為:

PHP Attributes: how to use PHP Attributes and create custom attribute classes – Fast Tips

透過使用屬性,他們強制聲明偏移函數中參數的資料類型。使用 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

PHP Attributes: how to use PHP Attributes and create custom attribute classes – Fast Tips

版本聲明 本文轉載於:https://dev.to/inspector/php-attributes-how-to-use-php-attributes-and-create-custom-attribute-classes-fast-tips-7nf?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-15
  • 我們能否在正規表示式中實現真正的可變長度向後尋找?
    我們能否在正規表示式中實現真正的可變長度向後尋找?
    正規表示式的可變長度回顧斷言替代方案正規表示式中的可變長度回顧斷言,用(?具有正規表示式模組的 PythonPython 正規表示式模組提供可變長度後向斷言的支援。 import regex m = regex.search('(?<!foo.*)bar', 'f00bar') pr...
    程式設計 發佈於2024-11-15
  • 您應該為您的應用程式選擇哪種地理鄰近度公式?
    您應該為您的應用程式選擇哪種地理鄰近度公式?
    地理位置鄰近度計算:公式比較在開發地理位置鄰近度搜尋時,了解公式選項之間的細微差別至關重要。雖然大圓距離公式和半正矢公式曾經被認為是同義詞,但它們之間存在一些微妙的區別,這些區別會影響速度、準確性和效率。 公式比較用於地理計算的三個主要公式鄰近度計算為:1。半正弦公式:d = 2r * arcsin...
    程式設計 發佈於2024-11-15
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1和$array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建構一...
    程式設計 發佈於2024-11-15
  • 如何使用 Twitter Bootstrap 對齊表格中的文字?
    如何使用 Twitter Bootstrap 對齊表格中的文字?
    Twitter Bootstrap 中的表格文字對齊在Twitter 的Bootstrap 架構中,您可以使用指定的文字對齊類別來對齊表格內的文本。 Bootstrap 3text-left:左對齊文字text-center:居中對齊文字text -right:右對齊文字Bootstrap 4te...
    程式設計 發佈於2024-11-15
  • 如何讓 CSS 中的空白表格儲存格的邊框可見?
    如何讓 CSS 中的空白表格儲存格的邊框可見?
    我可以在 CSS 中讓空白儲存格的邊框可見嗎? 在 Internet Explorer 7 中,預設可能不會顯示空白儲存格的邊框。不過,有幾種方法可以解決此問題。 使用不間斷空格如果可行,請插入不間斷空格 ( )進入空單元格可以強制瀏覽器渲染帶有邊框的單元格。 純 CSS解決方案對於純CSS解決方案...
    程式設計 發佈於2024-11-15
  • 如何將 Python 清單轉換為 CSV 檔案?
    如何將 Python 清單轉換為 CSV 檔案?
    將Python 清單清單匯出至CSV 檔案將Python 清單清單轉換為CSV 檔案,確保每個子清單中都會保留不同類型(浮點型、整數型、字串型)的資料。所需的 CSV 格式涉及使用逗號分隔每個子清單中的元素並垂直對齊子清單。 要實現此目的,您可以利用 Python 的內建 csv 模組:import...
    程式設計 發佈於2024-11-15
  • 測試限制:了解軟體測試的邊界
    測試限制:了解軟體測試的邊界
    软件测试是确保软件质量、稳定性和功能的开发过程的重要组成部分。然而,尽管测试很重要,但它也有其局限性。虽然它可以揭示缺陷,但它不能保证应用程序完全没有错误。了解这些限制有助于企业和开发人员设定切合实际的期望并优化他们的测试流程。在本文中,我们将探讨软件测试的主要局限性及其带来的挑战。 无法测试每个...
    程式設計 發佈於2024-11-15
  • 如何有效地將檔案載入到`std::vector`中?
    如何有效地將檔案載入到`std::vector`中?
    有效率地將檔案載入到std::vector有效率地將檔案載入std::vector ,必須避免不必要的複製和記憶體重新分配。雖然利用 Reserve 和 read() 的原始方法看起來可能很直接,但單獨的 Reserve() 並不會改變向量的容量。 使用迭代器的規範方法:規範方法使用輸入流迭代器來方...
    程式設計 發佈於2024-11-15
  • 如何在 Go 中將陣列元素直接解壓縮為變數?
    如何在 Go 中將陣列元素直接解壓縮為變數?
    在 Go 中解包數組元素Go 缺乏將數組元素直接解包到 Python 中的變數的便捷語法。雖然提問者使用中間變數的初始方法有效,但它可能會導致程式碼混亂,尤其是在複雜的場景中。 多個回傳值為了解決這個問題,建議使用解決方案是建立一個傳回多個值的函數。例如,要拆分字串並將結果解壓縮為兩個變量,可以使用...
    程式設計 發佈於2024-11-15
  • 「n:m」和「1:n」關係如何塑造資料庫設計?
    「n:m」和「1:n」關係如何塑造資料庫設計?
    理解關聯式資料庫設計:「n:m」與「1:n」的意義在資料庫設計中,符號「 n :m」和「1:n」在表示表或實體之間的關係方面起著至關重要的作用。這些符號表示它們關聯的基數。 "n:m" 關係:多對多「n:m」關係表示多對多兩個資料實體之間的對多關聯。這意味著對於一個表中的每個實體...
    程式設計 發佈於2024-11-15
  • 如何在 Java 中尋找重定向的 URL?
    如何在 Java 中尋找重定向的 URL?
    在Java 中查找重定向URL在Java 中訪問網頁時,處理URL 重定向到備用位置的情況至關重要。若要確定已重新導向的 URL,您可以使用 URL 和 URLConnection 類別。 使用 URLConnection.getUrl()使用 URLConnection 建立連線後,您可以擷取連線...
    程式設計 發佈於2024-11-15
  • 在 C++ 中將字串轉換為整數時如何處理轉換錯誤?
    在 C++ 中將字串轉換為整數時如何處理轉換錯誤?
    使用 C 中的錯誤處理將字串轉換為 int 將字串轉換為整數是程式設計中的常見任務。但是,在某些情況下,字串值可能無法成功轉換為整數。在這種情況下,優雅地處理轉換失敗至關重要。 boost::lexical_cast將字串轉換為 int 時出現錯誤的最直接方法之一處理方法是使用 boost::lex...
    程式設計 發佈於2024-11-15
  • 如何在 JavaScript 中存取 PHP 變數?
    如何在 JavaScript 中存取 PHP 變數?
    在 JavaScript 中存取 PHP 變數直接在 JavaScript 中存取 PHP 變數是一個挑戰。但是,有一些方法可以實現此目的:使用嵌入式PHP 語句:在JavaScript 區塊中嵌入PHP 程式碼允許您將PHP 變數指派給JavaScript 變數:<script type=&...
    程式設計 發佈於2024-11-15
  • 多執行緒概念 部分死鎖
    多執行緒概念 部分死鎖
    欢迎来到我们的多线程系列的第 3 部分! 在第 1 部分中,我们探讨了原子性 和 不变性。 在第 2 部分中,我们讨论了饥饿。 在这一部分中,我们将深入研究多线程中死锁的机制。原因是什么,如何识别以及可以使用的预防策略,以避免将代码变成僵局。应用程序逐渐停止,通常没有任何明显的错误,让开发人员...
    程式設計 發佈於2024-11-15

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3