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

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

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

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]刪除
最新教學 更多>
  • 我可以將加密從McRypt遷移到OpenSSL,並使用OpenSSL遷移MCRYPT加密數據?
    我可以將加密從McRypt遷移到OpenSSL,並使用OpenSSL遷移MCRYPT加密數據?
    將我的加密庫從mcrypt升級到openssl 問題:是否可以將我的加密庫從McRypt升級到OpenSSL?如果是這樣,如何? 答案:是的,可以將您的Encryption庫從McRypt升級到OpenSSL。 可以使用openssl。 附加說明: [openssl_decrypt()函數要求...
    程式設計 發佈於2025-05-23
  • 如何有效地轉換PHP中的時區?
    如何有效地轉換PHP中的時區?
    在PHP 利用dateTime對象和functions DateTime對象及其相應的功能別名為時區轉換提供方便的方法。例如: //定義用戶的時區 date_default_timezone_set('歐洲/倫敦'); //創建DateTime對象 $ dateTime = ne...
    程式設計 發佈於2025-05-23
  • Java中如何使用觀察者模式實現自定義事件?
    Java中如何使用觀察者模式實現自定義事件?
    在Java 中創建自定義事件的自定義事件在許多編程場景中都是無關緊要的,使組件能夠基於特定的觸發器相互通信。本文旨在解決以下內容:問題語句我們如何在Java中實現自定義事件以促進基於特定事件的對象之間的交互,定義了管理訂閱者的類界面。 以下代碼片段演示瞭如何使用觀察者模式創建自定義事件: args...
    程式設計 發佈於2025-05-23
  • Java是否允許多種返回類型:仔細研究通用方法?
    Java是否允許多種返回類型:仔細研究通用方法?
    在Java中的多個返回類型:一種誤解類型:在Java編程中揭示,在Java編程中,Peculiar方法簽名可能會出現,可能會出現,使開發人員陷入困境,使開發人員陷入困境。 getResult(string s); ,其中foo是自定義類。該方法聲明似乎擁有兩種返回類型:列表和E。但這確實是如此嗎...
    程式設計 發佈於2025-05-23
  • 為什麼PHP的DateTime :: Modify('+1個月')會產生意外的結果?
    為什麼PHP的DateTime :: Modify('+1個月')會產生意外的結果?
    使用php dateTime修改月份:發現預期的行為在使用PHP的DateTime類時,添加或減去幾個月可能並不總是會產生預期的結果。正如文檔所警告的那樣,“當心”這些操作的“不像看起來那樣直觀。 考慮文檔中給出的示例:這是內部發生的事情: 現在在3月3日添加另一個月,因為2月在2001年只有2...
    程式設計 發佈於2025-05-23
  • 如何在其容器內為DIV創建平滑的左右CSS動畫?
    如何在其容器內為DIV創建平滑的左右CSS動畫?
    通用CSS動畫,用於左右運動 ,我們將探索創建一個通用的CSS動畫,以向左和右移動DIV,從而到達其容器的邊緣。該動畫可以應用於具有絕對定位的任何div,無論其未知長度如何。 問題:使用左直接導致瞬時消失 更加流暢的解決方案:混合轉換和左 [並實現平穩的,線性的運動,我們介紹了線性的轉換。...
    程式設計 發佈於2025-05-23
  • 在PHP中如何高效檢測空數組?
    在PHP中如何高效檢測空數組?
    在PHP 中檢查一個空數組可以通過各種方法在PHP中確定一個空數組。如果需要驗證任何數組元素的存在,則PHP的鬆散鍵入允許對數組本身進行直接評估:一種更嚴格的方法涉及使用count()函數: if(count(count($ playerList)=== 0){ //列表為空。 } 對...
    程式設計 發佈於2025-05-23
  • 您可以使用CSS在Chrome和Firefox中染色控制台輸出嗎?
    您可以使用CSS在Chrome和Firefox中染色控制台輸出嗎?
    在javascript console 中顯示顏色是可以使用chrome的控制台顯示彩色文本,例如紅色的redors,for for for for錯誤消息? 回答是的,可以使用CSS將顏色添加到Chrome和Firefox中的控制台顯示的消息(版本31或更高版本)中。要實現這一目標,請使用以下...
    程式設計 發佈於2025-05-23
  • 哪種方法更有效地用於點 - 填點檢測:射線跟踪或matplotlib \的路徑contains_points?
    哪種方法更有效地用於點 - 填點檢測:射線跟踪或matplotlib \的路徑contains_points?
    在Python Matplotlib's path.contains_points FunctionMatplotlib's path.contains_points function employs a path object to represent the polygon.它...
    程式設計 發佈於2025-05-23
  • 如何實時捕獲和流媒體以進行聊天機器人命令執行?
    如何實時捕獲和流媒體以進行聊天機器人命令執行?
    在開發能夠執行命令的chatbots的領域中,實時從命令執行實時捕獲Stdout,一個常見的需求是能夠檢索和顯示標準輸出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    程式設計 發佈於2025-05-23
  • Python中何時用"try"而非"if"檢測變量值?
    Python中何時用"try"而非"if"檢測變量值?
    使用“ try“ vs.” if”來測試python 在python中的變量值,在某些情況下,您可能需要在處理之前檢查變量是否具有值。在使用“如果”或“ try”構建體之間決定。 “ if” constructs result = function() 如果結果: 對於結果: ...
    程式設計 發佈於2025-05-23
  • 如何在Java字符串中有效替換多個子字符串?
    如何在Java字符串中有效替換多個子字符串?
    在java 中有效地替換多個substring,需要在需要替換一個字符串中的多個substring的情況下,很容易求助於重複應用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    程式設計 發佈於2025-05-23
  • 如何使用Python的請求和假用戶代理繞過網站塊?
    如何使用Python的請求和假用戶代理繞過網站塊?
    如何使用Python的請求模擬瀏覽器行為,以及偽造的用戶代理提供了一個用戶 - 代理標頭一個有效方法是提供有效的用戶式header,以提供有效的用戶 - 設置,該標題可以通過browser和Acterner Systems the equestersystermery和操作系統。通過模仿像Chro...
    程式設計 發佈於2025-05-23
  • 為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    mySQL錯誤#1089:錯誤的前綴鍵錯誤descript [#1089-不正確的前綴鍵在嘗試在表中創建一個prefix鍵時會出現。前綴鍵旨在索引字符串列的特定前綴長度長度,可以更快地搜索這些前綴。 了解prefix keys `這將在整個Movie_ID列上創建標準主鍵。主密鑰對於唯一識...
    程式設計 發佈於2025-05-23
  • 為什麼不使用CSS`content'屬性顯示圖像?
    為什麼不使用CSS`content'屬性顯示圖像?
    在Firefox extemers屬性為某些圖像很大,&& && && &&華倍華倍[華氏華倍華氏度]很少見,卻是某些瀏覽屬性很少,尤其是特定於Firefox的某些瀏覽器未能在使用內容屬性引用時未能顯示圖像的情況。這可以在提供的CSS類中看到:。 googlepic { 內容:url(&...
    程式設計 發佈於2025-05-23

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

Copyright© 2022 湘ICP备2022001581号-3