php 屬性是在 php 8.0 中引入的。該版本標(biāo)志著該語言的一個(gè)重要里程碑,帶來了一些新功能和改進(jìn),包括引入用于向代碼聲明添加元數(shù)據(jù)的屬性。
我第一次必須處理屬性是由于 inspector 的 php 庫中的一個(gè)問題。檢查 github。在深入研究解決方案之前,讓我們先概述一下屬性是什么以及如何在 php 代碼中使用它們。
屬性是一項(xiàng)強(qiáng)大的功能,允許您將元數(shù)據(jù)添加到類、方法或?qū)傩缘嚷暶髦小_@些元數(shù)據(jù)可以通過編程方式檢索,為更干凈、更有組織、更高效的代碼開辟了新的可能性。
記住,屬性在運(yùn)行時(shí)沒有效果。它們將在反射 api 中可用,使您的應(yīng)用程序能夠根據(jù)附加到類、方法或?qū)傩缘膶傩粤私饽胍\(yùn)行的內(nèi)容。
內(nèi)置屬性
php 附帶了幾個(gè)用于不同目的的內(nèi)置屬性。以下是一些值得注意的:
@已棄用
將函數(shù)或方法標(biāo)記為已棄用,表明應(yīng)避免使用它,因?yàn)樗赡軙?huì)在未來版本中被刪除。
#[deprecated("use newfunction() instead")] function oldfunction() { // function implementation }
登錄后復(fù)制
@覆蓋
確保子類中的方法旨在覆蓋父類中的方法。
class child extends parent { #[override] public function defaultmethod() { // method implementation } }
登錄后復(fù)制
如果 defaultmethod() 最終將在父類中更改其名稱,則這不再是重寫。在這種情況下,php 將發(fā)出警告,因?yàn)槲覀兠鞔_聲明我們希望進(jìn)行覆蓋并提醒我們有關(guān)未對(duì)齊的情況。
不管怎樣,一個(gè)好的ide應(yīng)該能讓我們不犯這樣的錯(cuò)誤。
@suppresswarnings
抑制特定代碼段的特定警告。
#[suppresswarnings("somewarning")] function somefunction() { // function implementation }
登錄后復(fù)制
創(chuàng)建自定義屬性類
現(xiàn)在,讓我們創(chuàng)建一個(gè)自定義屬性類。當(dāng)您想要將特定行為封裝在屬性中時(shí),這非常有用。
#[attribute] class customattribute { public string $message; public function __construct(string $message) { $this->message = $message; } }
登錄后復(fù)制
然后您可以在各種元素上使用此自定義屬性:
class myclass { #[customattribute("this is a custom attribute")] public $myproperty; #[customattribute("another custom attribute")] public function mymethod() { // method implementation } }
登錄后復(fù)制
使用示例
讓我們探討一個(gè)實(shí)際的例子。假設(shè)您正在構(gòu)建一個(gè) web 應(yīng)用程序,并且您想要?jiǎng)?chuàng)建一個(gè)自定義屬性來定義字符串的長(zhǎng)度:
#[attribute(attribute::target_property)] class maxlength { public int $maxlength; public function __construct(int $maxlength) { $this->maxlength = $maxlength; } }
登錄后復(fù)制
在上面的示例中,我們限制了僅將屬性應(yīng)用于類屬性的能力。現(xiàn)在我們可以在 user 類中使用它:
class user { #[maxlength(20, message: "username must be 20 characters or less")] public string $username; // other properties and methods }
登錄后復(fù)制
前面提到,向?qū)傩蕴砑訉傩栽趫?zhí)行過程中沒有任何影響。但我們現(xiàn)在可以使用反射檢索這些信息,最終采取一些行動(dòng)。
php 框架的采用
最常用的 php 框架(如 symfony 和 laravel)已經(jīng)采用屬性來基本上取代“注釋”。在 symfony 5.2 或更高版本中,您可以聲明一個(gè)控制器并使用屬性將其連接到路由:
public class arrayable implements \arrayaccess { … public function offsetexists($offset) { return isset($this->data[$offset]); } … }
登錄后復(fù)制
自 php 8 起,arrayaccess 接口的定義更改為:
通過使用屬性,他們強(qiáng)制聲明偏移函數(shù)中參數(shù)的數(shù)據(jù)類型。使用 languageleveltypeaware 屬性,如果實(shí)現(xiàn)不提供參數(shù)的數(shù)據(jù)類型,則會(huì)觸發(fā)“棄用警告”。
但是在函數(shù)參數(shù)中聲明數(shù)據(jù)類型會(huì)破壞與不支持參數(shù)數(shù)據(jù)類型聲明的舊版本 php 的兼容性。
由于這只是對(duì)未來更改的警告,我們使用另一個(gè)內(nèi)置 php 屬性來解決該問題以抑制警告:
public class Arrayable implements \ArrayAccess { … #[\ReturnTypeWillChange] public function offsetExists($offset) { return isset($this->data[$offset]); } … }
登錄后復(fù)制
returntypewillchange 屬性只是告訴 php,我們了解該語言的未來變化,并且我們已經(jīng)計(jì)劃了必要的更新。
特別是對(duì)于這一更改,它們肯定會(huì)在 php 9 中實(shí)現(xiàn)。
請(qǐng)記住明智地使用屬性,保持代碼庫干凈且有詳細(xì)記錄。這在 saas 產(chǎn)品開發(fā)中尤其重要,因?yàn)榭蓴U(kuò)展性、可維護(hù)性和效率至關(guān)重要。
督察新人?免費(fèi)監(jiān)控您的應(yīng)用程序
inspector 是一款專為軟件開發(fā)人員設(shè)計(jì)的代碼執(zhí)行監(jiān)控工具。您不需要在服務(wù)器級(jí)別安裝任何東西,只需安裝 composer 包 就可以開始了。
與其他復(fù)雜的一體化平臺(tái)不同,inspector 超級(jí)簡(jiǎn)單,并且對(duì) php 友好。您可以嘗試我們的 laravel 或 symfony 包。
如果您正在尋找有效的自動(dòng)化、深入的見解以及將警報(bào)和通知轉(zhuǎn)發(fā)到消息傳遞環(huán)境的能力,請(qǐng)免費(fèi)嘗試 inspector。注冊(cè)您的帳戶。
或在網(wǎng)站上了解更多:https://inspector.dev